黑马程序员---面向对象笔记总结
------- android培訓、java培訓、期待與您交流! ----------
?
????????
??封裝
????????????????匿名函數??
?
2--匿名對象使用方式一,當對象的方法只調用一次時,可以用匿名對象完成,這樣寫比較簡單,如果對一個對象進行多個成員必須個這個對象起個名字
3--匿名對象使用方式二,可以將匿名對象作為實際參數進行傳遞
4--void是一種返回類型,代表沒有具體返回類型的結果,而構造函數根本不需要定義返回類型?????????????????????
???????????????????????構造函數
構造函數作用可以給對象初始化
因為現在任意一個對象,就具有基本的屬性
??6--構造函數小細節:當一個類沒有定義構造函數是,那么系統會給類加一個空值,擋在類中自定義了構造函數后,默認的函數就沒有
7--構造函數在寫法上有不同,在運行上也不同構造函數在對象已建立就運行,對象初始化、而一般方法是對象調用才執行,給對象添加對象具備的功能
一個對象建立,構造函數只運行一次,而一般方法可被對象調用多次。
?
構造函數不可以使用return
?
8--什么時候該定義構造函數,當分析事務,具備以下特性或行為,那么將這些類容定義在構造函數中
????????????????????????構造代碼塊
{
System.out.println("dddddddddddddddddd");
}
構造代碼塊,就是沒構造函數名
作用,給對象進行初始化
對象一建立就運行,優先于構造函數
構造代碼塊,是給所有對象進行統一初始化
二構造函數式給對應的對象初始化
??構造函數是可以私有化的
?????????????????????This
This代表他所在函數所屬對象的引用
那個對象調用this,this就代表那個對象
就單說:那個對象在調用this所在的函數,this就代表那個對象
什么時候用this當定義類中功能時,該函數內都要調用該函數的對象時,這是用this來表示這個對象。但凡本類功能使用本類對象用this表示
構造函數之間調用只能用this語句
初始化的?動作要先執行
This語句只能定義子啊構造函數的第一行,因為初始化先執行
???????????????????????Static
是一個靜態?static???是一個修飾符修飾成員變量和方法
?特點
隨著類的加載而加載,也就是靜態隨類的消失而消失?說明他的生命周期最長
優先于對象的存在被所有對象共享可以直接被類名所共享,
實例變量生命周期歲對象消失而消失
靜態方法只能訪問靜態成員?包括方法和變量非靜態可以訪問靜態成員靜態方法中不可以定義this和super關鍵字
因為靜態優先于對象存在,所以靜態方法中不可以出現this
靜態有利有弊,利:對對象共享的數據進行單獨空間存儲節省內存空間,沒有必要每個對象都存儲一份
可以直接被類名調用
弊端:聲明周期太長,訪問出現局限性,靜態只能范文靜態
?
????
?
?
什么時候定義靜態變量或類呢?
當對象中出現共享數據時,該數據被靜態所修飾,該對象中的特有數據也就是說不是共享的要定義成非靜態存在于堆內存中
?????什么時候定義靜態函數呢?
當功能內部沒有訪問到非靜態數據或對象的特有數據,那么該功能可以定義靜態的
?
?
?
????????????????????????主函數定義
Public?代表該函數局限最大
Static?代表主函數隨類的加載存在
Void?主函數沒有具體的返回值
main?不是關鍵字,是一個特殊的單詞?可以被jvm識別
????????????????????工具類
通常情況下,工具類都是定義的靜態方法
下面我們就制作這個工具欄的?說明書,通過文檔注釋來說明
?在類文件中/**
?這是一個可以對數組進操作的工具類,該類中提供了,獲取最值,排序等功能;
?
*/
要想把一個類生存幫助文檔的話,這個類必須是?公用的,也就是說必須被public所修飾
?
?如?public?ArrayTool?class
?
?
?
????????????????靜態代碼塊
Static?{
?
}
對象初始化過程
先執行類中的?static代碼塊,?如果有的haunted,給類進行初始化
在堆內存中開辟空間,分配內存地址
在堆內存中建立對象的特有屬性,并默認初始化
對屬性進行顯示初始化
?對對象進行構造代碼塊的初始化
對對象進行對應的,構造函數初始化
將內存地址賦給棧內存中的變量
????????設計模式
??
單列設計模式?:解決一個類在內存只存在一個對象
保證對象唯一性
1,為了避免其他程序過多的建立該類對象。先禁止頭程序建立該類的對象
2,我了讓其他程序訪問該類對象,只好在本類中,自定義一個對象
3,我了方便其他程序對自定義對象的訪問,可以對外提供一些訪問方式
對象存在堆里面
以上三步用代碼體現
1,將構造函數私有化
2,在類中創建一個本類對象
3,提供一個方法可以獲取該對象
?
對于事物該怎么描述就怎么描述
當需要將該事物,的對象保證在內存中唯一是,就將以上三步都加上
列如代碼:
//單列設計模式一:餓漢式
?private?static?Student?s=new?Student();
?private?student(){}
?public?static?Student?getStudent()
?{
return?s;
?}
單列設計模式二:懶漢式
class?single
{
private?static?single?s=null;
private?single(){}
if(s==null)
{
//這表示只能有一個程序進來,如果其他程序進來,這就判斷s不等于空,
其他程序就進不來
//如果A進來
??synchronized?(single.class);//這句換是要求同步執行程序
public?static?singlg?getInstance()
{
if?(s==null)
--》A//A就在這里,其他的就進不來,對多走到synchronized這里
s=new?single();
return?s;
}
}
}
記住?定義單列時,最好使用餓漢式。
?
???????????繼承
1,提高代碼的復用性
2,讓類與類之間產生的關系,有了這個關系,才有了多態的特性
注意
千萬不要為了獲取其他類的功能。為了簡化代碼而產生繼承
必須是類與類之間有所屬關系才可以繼承;
?
在java語言中,java只支持單繼承,不支持多繼承。因為多繼承容易帶來安全隱患:當父類中定義了相同功能,當功能相同時子類不確定應用哪一個
但是java保留了這種機制,并用了另一種體現形式來完成表示,多實現、
Java支持多層繼承,也就是一個繼承體系,如何使用一個繼承體系中的功能呢
想要使用體系,先查詢體系父類的描述,因為父類中定義的是該體系中共性的功能,通過了解共性功能,就可以知道該體系的基本功能,那么這個體系就已經基本可以使用了。
在具體調用時要創建子類的對象,為什么?
1,因為父類有可能不能創建對象,
2,創建子類對象,可以使用跟多的?功能,包括基本的也有特性的。
簡單一句話,就是查閱父類功能,創建子類對象的使用功能
?
??????????????組合--聚集關系、
?
???????子父類中變量的特點
??1變量
???1.如果,父類中出現非私有的成員變量時,子類要訪問本類中的變量,用this
子類要訪問父類中的同名變量,用super
Super和this使用幾乎是一致的,this代表是本類對象的引用,super的代表父類對象的引用
?
????????子父類中的函數的特點=覆蓋
當子類出現和父類一樣的函數時,但子類對象調用該對象函數,
會運行子類函數的類容;
如同父類函數被覆蓋一樣。這種情況是函數的另一個特性,:重寫(覆蓋)
?
但子類繼承父類,沿襲了父類的功能,到子類中
但子類雖然具備該功能,但是功能的內容卻和父類不一致
這時,沒有必要定義新功能,而是使用覆蓋特殊,
保留父類的功能的定義,并重寫功能類容
?
?覆蓋?注意:
子類覆蓋父類,必須保證子類權限大于等于父類權限,才可以覆蓋,否則編譯失敗
覆蓋必須要加關鍵之public
2,靜態只能覆蓋靜態
記住
重載:只看同名函數的參數列表
重寫:子父類方法一模一樣,
???????????子父類中的構造函數特點,子類實例化過程
?
在子類中有一個隱藏的用法就是
zi
{
?
Super();調用父類構造函數
Zi()
{
}
在對子類對象進行初始化是,父類?的構造函數也會運行,那是因為子類的構造函數默認第一行有一天隱藏的語句super();
Super會訪問父類的空參數的構造函數,子類所有的構造函數都有一個默認的?super();
?????????????為什么子類一定要訪問父類的構造函數,
因為:父類中數據子類可以獲取,所以子類在建立是,需先查看父類如何對這些數據進行初始化的所以子類初始化時,要先訪問父類的構造函數
如果要訪問父類指定的構造函數,可以通過手動定義super語句的方式來指定
?
Super一定要定義在子類的構造函數的第一行
???子類實例化過程
結論:子類的所有的構造函數默認都會訪問父類中空參數的構造函數
因為子類每一個構造函數的第一句都有一個隱藏的super()當父類中沒有空參數的構造函
數是,子類必須手動通過super或者this語句形式來指定訪問父類中的構造函數,類的構造函數第一行也可以手動指定this語句來訪問本類的構造函數,
子類中至少會有一個構造函數會訪問父類的構造函數
?
?
}
?
?
??????????????????????????????Final?
???
修飾類,修飾的類不可以被繼承,修飾的函數不可以被覆蓋
修飾的變量是一個常量,只能賦值一次
被final修飾的類不可以被繼承,是為了避免被子類覆蓋功能
Final?class?demo{
Void?show();
}
//這是錯誤的繼承
Class?sub?extends?demo{
?
}
?
被final修飾的變量時一個常量只能賦值一次,既可以修飾成員變量又可以修飾局部變量
?Final?int?x=9;
這是x終生為9了,不能改變
注意:當在描述事物一些數據的?出現值是固定的,這是為了增強閱讀,都給這些值加上final
?????Final就是為了要鎖定常量值
?????如果要共享,就在final前加static?被final定義的就必須要大寫
???????????????????????????????抽象類
?
當多個類中出現相同功能,但功能主體不同,這是可以向上抽取,這只抽取聲明的方法(定義的),不
抽取功能主體
抽象就是看不懂
??抽象類的特點,
1,抽象方法,一定在抽象類中
2.抽象方法和抽象類必須被abstract所修飾
3.抽象類不可以用new創建對象,因為調用抽象方法沒意義
4.抽象類方法要被使用,必須由子類復寫所有抽象方法后,建立子類對象調用
5.如果子類只覆蓋部分抽象方法,那么該子類還是一個抽象類
6.??抽象類可以強迫子類做一些事情
7.抽象類和一般類沒有太大不同
8.該如何描述事物,就如何描述,這是在事物出現了看不懂的東西
9.這些事物功能需要明確出現,但無法定義主體,就通過抽象方法來表示,
10.抽象類比一般類多了一個抽象方法,就是在類中可以定義抽象方法,也只能定義抽象方法
11.抽象類不可以實例化,
12.特點:?抽象類中可以不定義抽象方法,這樣做只是不讓改類建立對象
????????????????????????模板方法模式???
獲取時間?system.currenttimemillis();
當代嗎完成優化后,就可以解決這類問題
這種方式,模板方法設計模式
?
什么是模板方法
定義功能是,功能的一部分確定,但有一部分不確定,而確定的部分在使用不確定的部分那么著時就將不不確定的部分暴露了,有該類子類去完成
?????????????????????接口
接口:初期理解,可以理解為一個特殊的抽象類
抽象類的方法都是抽象的,那么該類可以通過接口的形式來表示
?接口里面成員:全是抽象的
接口在定義時,格式
1,接口中常見定義:常量,抽象方法
接口中成員都有固定修飾符
常量:public?static?final
方法,public?abstract
接口中的成員都是?public的
?
接口是不可以常見對象的,因為都是抽象方法
需要被子類實現,??子類要把接口里的抽象方法全都覆蓋后,才能實例化
否則子類是個抽象類
接口可以被類多實現,
一個類在繼承一個類時,還可以實現多個接口
類與接口之間的關系式實現關系
?
????????接口的特點
?
基本功能實現在類中,擴展功能實現在接口中
?
?
??????????????????????多態
多態可也理解為事物存在的?多種形態
?
函數也具有多態
1?多態的體系
?父類的引用指向了自己的類中對象
?2,多太的前提
??必須是類與類之間的關系,要么繼承,要么實現
?通常還有一個就是存在覆蓋
3?多態弊端,?
?提高擴展性?但是只能使用父類的引用訪問父類的成員
不能使用子類的特有屬性
?
3,多態的好處
???大大的提高了程序的擴展性
多太的擴展性
abstract?class?Animal
{
public?abstract?void?eat();
}
?
class?Cat?extends?Animal
{
public?void?eat()
{
System.out.println("吃魚");
}
public?void?catchMouse()
{
System.out.println("抓老鼠");
?
}
?
}
class?Dog?extends?Animal
{
public?void?eat()
{
System.out.println("吃骨頭");
}
public?void?kanjia()
{
System.out.println("看家");
?
}
?
}
public?static?void?main(String[]?args)?
{
//Cat?c=new?Cat();
//c.eat();
function(new?Cat());
function(new?Dog());
function(new?Cat());
?
}
public?static?void?function(Animal?a)
{
a.eat();
}
?
?
如果想要調用貓的?特有方法是,如何操作
強制將父類的引用,轉換成子類類型
?列如
Cat?c=?(Cat)a;
c.catchMouse();
前往不要出現將父類對象轉換成子類的類型
我們能轉換的是父類應指向自己的子類對象時,gia可以被提升,也可以
強制轉換
多態始終都是子類對象在變化
???多態成員函數非靜態的特點
?
在編譯時:引用變量所屬的類中是否所有調用的方法,
如果有?編譯通過,沒有則,編譯失敗
在運行時,參閱對象所屬的類中是否有調用的方法
總結:成員函數在多態調用時,編譯看左邊,運行看右邊
?在多態中,靜態成員函數的特點,無論編譯和運行都參考左邊
?
??
Object?是所有對象的:根類
Object?類中已經提出對對象是否相同的比較方法
??????????????????????????
?????????內部類
?
非靜態內部類不能定義靜態函數
?
內部類的訪問規則,可以直接訪問外部類的成員,包括私有
2外部類要訪問內部類,必須建立內部類對象
內部類可以被私有化,外部類覺得不能被私有化
之所以,可以直接訪問外部類的成員,是因為內部類有一個外部類的引用
格式?外部類名、this
?
訪問格式,當內部類定義在外部類的成員位置上,而且私有,可以再外部其他類中
可以直接建立?對象,
格式,外部類名,內部類名,?變量名=外部類對象,內部類對象
outer.inner?in=new?outer.inner();
?in.function();
當內部類在成員位置上,就可以被成員修飾符所修飾
Private?將內部類在外部類的進行封裝。
當內部類被靜態修飾后,只能直接訪問外部類中的靜態成員,出現了訪問局限
在外部其他類,如何直接訪問靜態內部類呢?
new?outer.inner().function();來直接訪問內部類的非靜態成員
在外部其他類,如何直接訪問非靜態成員呢?
outer.inner().function();
注意,:當內部類中定義靜態成員,該內部類必須是靜態的
當外部類中的靜態方法訪問內部類是內部類也必須是靜態的
內部類的作用就是能直接訪問外部類的事物
內部類定義局部是,不可以被成員修飾
可以直接訪問外部類中的成員,因為還持有外部類中的引用
?
但是不可一訪問他所在的局部中的變量,只能訪問被final修飾的局部變量
class?Outer?{
int?x?=?9;
void?method(final?int?a)?{
final?int?y=4;
class?inner?{
void?function()?{
System.out.println(a+y);
?
}
?
}
new?inner().function();
}
}
?class?innerobject?{
public?static?void?main(String[]?args)?{
new?Outer().method(5);
new?Outer().method(6);
?
}
?
}
匿名內部類,就是內部類,的public?void?run(){
for(int?x=0;x<100;x++)
{
System.out.println(Thread.currentThread().getName()+".."+x);
}
}式
?
2,定義匿名內部類的前提,內部類必須繼承一個類,
或者實現一個接口
匿名類?的格式寫法?new?父類或者借口(){定義子類內容}
class
{
public?static?void?main(String[]?args)
{
System.out.println("Hello?World!");
}
}
abstract?class?Absdemo
{
abstract?void?show();
}
?
class?outer
{
int?x=3;
?
public?void?function()
{
?
//這就是創建匿內部名類
new?AbsDemo()
{
void?show()
{
System.out.println("x="+x);
}.show();//調用成員方法
}
}
?
}
5.匿名內部類中定義的方法最好不要超過三個。?
轉載于:https://www.cnblogs.com/anxianjie/archive/2013/03/07/2948145.html
總結
以上是生活随笔為你收集整理的黑马程序员---面向对象笔记总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uiswitch样式_iOS - UIS
- 下一篇: 电子商务小结