1.1.內(nèi)部類介紹
1.1.1. 內(nèi)部類引入
生活中經(jīng)常會有一個事物再另一個事物里面浪蹂,二者相互依賴的情況抵栈;
例如:人體里面包含有心臟告材,二者是相互依賴的;
使用java程序描述人和心臟:
原來的描述方法:
問題:描述人和心臟的兩個類是兩個相互獨立的類古劲,可以單獨使用斥赋;體現(xiàn)不出來二者相互依賴的關(guān)系;
要解決這個問題产艾,就要使用內(nèi)部類疤剑;
1.1.2. 內(nèi)部類的代碼體現(xiàn)
內(nèi)部類芯咧,就是定義在其他類里面的類娃兽;
根據(jù)類寫在其他類里面的位置的不同萎胰,可以分為成員內(nèi)部類和局部內(nèi)部類世舰;
而包含內(nèi)部類的類就叫做外部類揽惹;
1.2.成員內(nèi)部類
成員內(nèi)部類作為外部類的一個成員捆蜀,也可以使用成員的修飾符修飾研底;
1.2.1. 非靜態(tài)成員內(nèi)部類
沒有使用static關(guān)鍵字修飾的成員內(nèi)部類就是非靜態(tài)成員內(nèi)部類畜吊;
類的非靜態(tài)成員必須通過類的對象使用踱阿;
所以非靜態(tài)成員內(nèi)部類管钳,也和外部類的對象有關(guān),里面只能定義非靜態(tài)成員软舌;而且非靜態(tài)成員內(nèi)部類的對象才漆,必須依賴于外部類的對象存在;
static final int b = 20;
結(jié)論:再非靜態(tài)成員內(nèi)部類中佛点,只能定義非靜態(tài)成員和常量變量醇滥,不能定義靜態(tài)成員;
結(jié)論:在外部類以外的類中使用非靜態(tài)成員內(nèi)部類,必須先要創(chuàng)建外部類的對象鸳玩,然后通過外部類的對象創(chuàng)建內(nèi)部類的對象焰手,通過內(nèi)部類的對象使用內(nèi)部類的成員;
結(jié)論:在外部類中使用內(nèi)部類的成員怀喉,外部類的非靜態(tài)函數(shù)中可以直接創(chuàng)建內(nèi)部類的對象书妻;靜態(tài)函數(shù)中需要先創(chuàng)建外部類對象,然后再通過外部類對象創(chuàng)建內(nèi)部類對象躬拢;
要能夠執(zhí)行到非靜態(tài)成員內(nèi)部類里面躲履,肯定已經(jīng)存在內(nèi)部類的對象;
一旦存在內(nèi)部類的對象聊闯,肯定已經(jīng)存在外部類的對象工猜;
非靜態(tài)成員內(nèi)部類里面可以直接使用外部類的所有成員;
結(jié)論:再非靜態(tài)成員內(nèi)部類中可以直接使用外部類的所有成員菱蔬;如果內(nèi)部類中定義了和外部類一樣的成員篷帅,要使用外部類的成員,
需要通過 外部類類名.this.成員名 的方式使用拴泌;
如果是調(diào)用外部類的靜態(tài)成員魏身,還可以直接使用 外部類類名.成員名 的方式調(diào)用;
1.2.2. 靜態(tài)成員內(nèi)部類
使用static關(guān)鍵字修飾的成員內(nèi)部類就是非靜態(tài)成員內(nèi)部類蚪腐;
靜態(tài)成員和類的對象無關(guān)箭昵,可以直接通過類名使用;
所以靜態(tài)成員內(nèi)部類和外部類的對象也沒有關(guān)系回季;只表示一個類在另一個類的里面家制,所以靜態(tài)成員內(nèi)部類又被稱為嵌套類泡一;
所以靜態(tài)成員內(nèi)部類使用起來和一般的類一樣,里面可以定義任何成員;要使用它的靜態(tài)成員,可以直接通過類名使用芥永;非靜態(tài)成員棘催,必須通過對象使用画畅;
在外部類以外的類中使用靜態(tài)成員內(nèi)部類:
在外部類中使用靜態(tài)成員內(nèi)部類的成員:
在外部類中可以直接使用內(nèi)部類的私有成員;
結(jié)論:
靜態(tài)成員內(nèi)部類细办,只表示這個類的位置在外部類中,和外部類的對象無關(guān),靜態(tài)成員可以直接通過類名調(diào)用,非靜態(tài)成員需要通過類的對象使用荧缘;
在靜態(tài)成員內(nèi)部類中使用外部類的成員,也是非靜態(tài)成員通過外部類的對象訪問育灸,靜態(tài)成員直接通過類名使用扑媚;
1.2.3. 私有成員內(nèi)部類
使用private關(guān)鍵字修飾的成員內(nèi)部類就叫做私有成員內(nèi)部類;
私有成員內(nèi)部類太雨,只能在定義它的外部類里面使用雪侥;
1.2.4. 私有靜態(tài)成員內(nèi)部類的一個應(yīng)用:單例的實現(xiàn)
單例夯辖,解決的就是在程序運行中,一個類最多只能有一個對象的問題谭跨;
餓漢式: 在類加載的時候就創(chuàng)建類的唯一實例
好處:可以保證對象的唯一性;
弊端:只要類一加載李滴,就會創(chuàng)建對象螃宙,會造成內(nèi)存上的浪費;
懶漢式: 在第一次調(diào)用類的對象時會創(chuàng)建這個類的唯一對象所坯;
好處:只有在需要使用時才創(chuàng)建對象谆扎,避免內(nèi)存浪費;
弊端:在多線程環(huán)境下芹助,不能保證對象的唯一性堂湖;
使用私有靜態(tài)內(nèi)部類的方式,可以避免上述問題状土,同時擁有他們的好處无蜂;
原理:
在使用Single類的其他靜態(tài)函數(shù)時,雖然也會加載Single類蒙谓,但是因為沒有使用到Inner類斥季,所以不會加載Inner類,也就不會創(chuàng)建Single類的對象累驮,避免了餓漢式的弊端酣倾;
在需要使用Single類的對象時舵揭,就會調(diào)用getInstance()函數(shù),這個函數(shù)里面會使用到Inner類躁锡;在第一次調(diào)用這個函數(shù)時才會加載Inner類午绳,在加載Inner類的時候才會創(chuàng)建Single類的對象;因為一個類只會加載一次稚铣,所以Single類的對象也只會創(chuàng)建一次箱叁,可以保證是唯一的,避免了懶漢式的弊端惕医;
1.3.局部內(nèi)部類
定義在外部類的局部位置的類就叫做局部內(nèi)部類耕漱;
一般都定義在函數(shù)中;
局部主要指的是使用范圍收到限制抬伺,所以局部內(nèi)部類只能在定義它的那個函數(shù)中使用螟够,其他地方不能使用;
局部內(nèi)部類中可以書寫的成員:
局部內(nèi)部類的使用:
局部內(nèi)部類使用外部類的成員:
1.4.匿名內(nèi)部類
1.4.1. 匿名內(nèi)部類
內(nèi)部類也是一個類峡钓,也可以繼承其他類妓笙,也可以實現(xiàn)接口;
有的時候能岩,需要繼承一個類寞宫,或者實現(xiàn)一個接口,應(yīng)該定義一個類拉鹃;但是如果這個類只需要使用一次辈赋,單獨創(chuàng)建一個類就太麻煩,
此時就可以使用匿名內(nèi)部類:
匿名內(nèi)部類的寫法:
new 類名():創(chuàng)建類的對象
new 類名(){}:表示創(chuàng)建類的子類的對象膏燕;這個類的子類是一個匿名類钥屈;
new 接口名(){}:表示創(chuàng)建了接口的一個實現(xiàn)類的對象;這個接口的實現(xiàn)類是一個匿名類坝辫;重寫接口中的方法篷就,應(yīng)該寫在大括號里面;
1.4.2. 匿名內(nèi)部類的面試題分析
問題:下列程序有沒有問題近忙?如果有竭业,問題是什么?如果沒有及舍,運行結(jié)果是什么永品?
class A
{
public static void main(String[] args)
{
new A(){
void show(){
System.out.println("AAAAAAAAAAA");
}
}.show();
A a = new A(){
void show(){
System.out.println("AAAAAAAAAAA");
}
};
a.show();
}
}
1.5.內(nèi)部類小結(jié)
內(nèi)部類的概念:定義在其他類里面的類叫做內(nèi)部類,包含內(nèi)部類的類叫做外部類击纬;
內(nèi)部類的作用:內(nèi)部類主要是用來描述一個事物存在于另一個事物里面,依賴于外部事物存在的钾麸;
內(nèi)部類的格式:
內(nèi)部類的分類:
成員內(nèi)部類
非靜態(tài)成員內(nèi)部類:
1更振、非靜態(tài)成員內(nèi)部類必須依賴于外部類的對象使用炕桨,所以:
A、非靜態(tài)內(nèi)部類中不能定義靜態(tài)成員肯腕,除非是常量變量献宫;
B、在外部類的非靜態(tài)函數(shù)中可以直接創(chuàng)建內(nèi)部類的對象实撒;
C姊途、在外部類的靜態(tài)函數(shù)中和外部類以外的類中都不能直接創(chuàng)建內(nèi)部類對象,需要先創(chuàng)建外部類對象知态,然后通過外部類對象創(chuàng)建內(nèi)部類對象捷兰;
2、在內(nèi)部類中负敏,可以直接使用外部類的所有成員贡茅;
3、如果內(nèi)部類中定義了和外部類中一樣的成員其做,優(yōu)先使用內(nèi)部類中的顶考;要使用外部類中的成員,可使用外部類類名.this.成員 的方式妖泄;
靜態(tài)成員內(nèi)部類:
1驹沿、靜態(tài)內(nèi)部類和外部類的對象無關(guān),僅僅表示內(nèi)部類和外部類的位置關(guān)系是嵌套關(guān)系蹈胡,所以又被稱為嵌套類渊季;
2、靜態(tài)成員內(nèi)部類中可以書寫所有成員审残;
3梭域、外部類使用靜態(tài)內(nèi)部類,訪問靜態(tài)成員可以通過類名直接訪問搅轿,訪問非靜態(tài)成員需要通過內(nèi)部類對象訪問
4病涨、靜態(tài)內(nèi)部類可以直接使用外部類的靜態(tài)成員;非靜態(tài)成員璧坟,需要通過外部類對象使用既穆;
5、外部類以外的類要使用靜態(tài)內(nèi)部類的成員雀鹃,和使用一般類一樣幻工,只是需要在類名前面加上外部類類名,表示內(nèi)部類是外部類的成員黎茎;
私有成員內(nèi)部類:
成員內(nèi)部類作為外部類的成員囊颅,也可以使用訪問權(quán)限修飾符修飾,如果使用private修飾,成員內(nèi)部類就成為私有成員內(nèi)部類踢代,只能在外部類里面使用盲憎,不能在外部類以外的類中使用;
局部內(nèi)部類
1胳挎、定義在函數(shù)里面的類叫做局部內(nèi)部類
2饼疙、在局部內(nèi)部類中不能定義靜態(tài)成員,除非是常量變量慕爬;
3窑眯、局部內(nèi)部類只能在定義它的函數(shù)中使用,隨著定義它的函數(shù)的執(zhí)行而執(zhí)行医窿;
4磅甩、在非靜態(tài)函數(shù)中的局部內(nèi)部類,可以直接使用外部類的靜態(tài)和非靜態(tài)成員留搔;
5更胖、在靜態(tài)函數(shù)中的局部內(nèi)部類,就只能直接使用外部類的靜態(tài)成員隔显;要使用非靜態(tài)成員却妨,需要創(chuàng)建外部類的對象;
6括眠、在局部內(nèi)部類中要使用定義它的函數(shù)中的變量彪标,需要將這個變量聲明為final的;
匿名內(nèi)部類:
當(dāng)要使用一個類的子類(或接口的實現(xiàn)類)時掷豺,如果這個子類(或者實現(xiàn)類)只會使用一次捞烟,就沒必要專門定義一個類出來,可以使用匿名內(nèi)部類的方式調(diào)用当船;
匿名內(nèi)部類的格式:
new 類名(){}:表示創(chuàng)建這個類的一個子類的對象题画;
new 接口名(){}:表示創(chuàng)建這個接口的一個實現(xiàn)類的對象;
2. java訪問權(quán)限
java的訪問權(quán)限有四種:
私有的德频,使用private關(guān)鍵字聲明苍息,表示被修飾的成員只能再定義他的那個類里面使用;
默認的壹置,不使用任何關(guān)鍵字修飾竞思,表示被修飾的成員只能在同一個類中或同一個包中的不同類之間使用;
受保護的钞护,使用關(guān)鍵字protected修飾盖喷,表示使用范圍比默認的多一點,就是可以在不同包中有繼承關(guān)系的子類中使用难咕;
公開的课梳,使用關(guān)鍵字publiuc修飾距辆,可以在任何地方使用;
結(jié)論:默認的訪問權(quán)限惦界,就是包訪問權(quán)限挑格,只能在同一個包中訪問;
受保護的訪問權(quán)限沾歪,不僅僅可以在同一個包中訪問,還能在子類中使用雾消;
java訪問權(quán)限表:(√:可以訪問灾搏; :不可訪問)
java中的訪問權(quán)限修飾符:
private:私有的被修飾的成員只能在本類中使用;
默認的(就是什么都不寫):默認的立润,被修飾的成員只能在本類和相同一個包中不同的類中使用狂窑;
protected:受保護的,主要是給子類使用桑腮;使用范圍和默認的相比泉哈,多一種場景可以使用,就是在不同包中不同的類破讨,只要有繼承關(guān)系丛晦,就可以使用;
public:公共的提陶,公開的烫沙;被修飾的成員在所有地方都能使用;
3. API文檔查詢
3.1.API的概
API(Application programming interface):應(yīng)用程序接口隙笆,指別人寫好的供大家使用的程序锌蓄;
API文檔:幫助我們理解和使用API的文檔就叫做API幫助文檔;
打個比方撑柔,API就相當(dāng)于別人制造好的手機瘸爽,我們要打電話,直接調(diào)用手機打電話的功能就ok了铅忿;
而API文檔剪决,就是手機使用說明書,告訴我們?nèi)绾问褂檬謾C辆沦;
3.2.API文檔查詢方法
3.2.1. 按包查詢?nèi)绻孪戎酪檎业念愒谀莻€包中昼捍,就可以使用按包查詢;
String類:它在java.lang包中肢扯;
3.2.2. 按索引查詢
如果已經(jīng)知道要找的類的類名妒茬,可以使用按索引查找;
找String類:
如果已經(jīng)知道要找的類名蔚晨,推薦使用這種方式乍钻,更快更準確肛循;
如果根本就不知道要查找的功能在哪個類中,可以先上網(wǎng)搜索银择;
例如多糠,要計算一個數(shù)字的平方根,經(jīng)過網(wǎng)上搜索浩考,發(fā)現(xiàn)應(yīng)該使用Math類夹孔;知道了類名,就可以使用按照索引查找的方式析孽,找到這個類搭伤,然后找到這個類的使用方式;
3.3.查看API文檔描述
3.3.1. 類所在的包
3.3.2. 類的繼承關(guān)系
3.3.3. 當(dāng)前類實現(xiàn)的接口
3.3.4. 類或者接口的定義格式
(紅框里的final袜瞬,表示這個類是最終的類怜俐,不能被繼承)
3.3.5. 類或者接口的功能描述
描述這個類或者接口該如何使用:
3.3.6. 類的構(gòu)造方法
查看類的構(gòu)造方法:
(有的類的構(gòu)造函數(shù)都是私有的,就沒有構(gòu)造方法摘要邓尤,表示這個類不能通過構(gòu)造函數(shù)創(chuàng)建對象拍鲤;)
查看具體方法的詳細說明(在方法摘要里直接點擊方法名就可以跳轉(zhuǎn)到方法詳細說明):
3.3.7. 類的方法摘要
查看一個類提供的方法;
查看具體方法的詳細說明(在方法摘要里直接點擊方法名就可以跳轉(zhuǎn)到方法詳細說明):
3.3.8. 字段摘要
字段汞扎,就是類的成員變量季稳;
前面的static,表示這是一個靜態(tài)成員變量佩捞;
4. Object類簡介
4.1.Object類簡介
Object是java中所有類的最高父類绞幌,表示java中所有對象最共性的行為;
在使用多態(tài)時一忱,可以使用Object類型指向java中的任何一個對象莲蜘;
4.2.toString方法
父類方法不滿足子類需求,需要在子類中重寫該方法帘营;
一般在開發(fā)中都要重寫toString方法票渠;
4.3.equals方法
所以要比較兩個對象的相等性,不能使用==比較芬迄,應(yīng)該使用equals方法比較问顷;!
所以需要在子類中重寫equals方法;
在開發(fā)中一般都需要根據(jù)具體需求重寫equals方法
重寫equals方法的步驟(1和2步的順序不是固定的):
1禀梳、判斷參數(shù)和調(diào)用函數(shù)的對象是否是同一個對象杜窄,如果是,直接返回true算途;否則塞耕,進行下一步;
2嘴瓤、判斷參數(shù)是否為null扫外,如果是莉钙,直接返回false,否則筛谚,進行下一步磁玉;
3、判斷參數(shù)和調(diào)用函數(shù)的類型是否一直驾讲,如果不一致蚊伞,直接返回false,否則進行下一步蝎毡;
4厚柳、對參數(shù)強制向下轉(zhuǎn)型為調(diào)用方法的對象所在的類型,然后根據(jù)需求比較兩個對象的具體細節(jié)沐兵;
4.4.Object小結(jié)
1、作用:Object類是java中所有類的最高父類便监,描述的是所有類最共性的功能扎谎;可以使用Object類型的引用指向java中所有對象(包括數(shù)組);
2烧董、toString方法:
作用:toString方法會返回一個對象的字符串的表示形式毁靶;在使用輸出指令輸出一個對象時,實際輸出的就是這個對象調(diào)用toString方法返回的結(jié)果逊移;一般開發(fā)中都要根據(jù)具體需求重寫這個方法预吆;
格式:public String toString()
3、equals方法
作用:用來比較兩個對象的相等性的胳泉;使用 == 運算符比較兩個變量拐叉,實際比較的是兩個變量里面保存的內(nèi)容;
所以對基本類型的變量來說扇商, == 比較的是實際的常量值凤瘦;對引用類型的變量來說,比較的是里面保存的引用地址案铺;所以要比較兩個數(shù)據(jù)的相等性蔬芥,基本類型的數(shù)據(jù)可以直接使用 == 比較,引用類型的數(shù)據(jù)則需要使用equals方法控汉;因為Object類中的實現(xiàn)是直接使用 == 比較兩個對象的引用地址笔诵,所以一般開發(fā)中需要根據(jù)具體的需求重寫equals方法;
格式:public boolean equals(Object obj)
重寫equals方法的一般步驟(1和2步的順序不是固定的):
1姑子、判斷傳入的參數(shù)obj是否為null(obj == null)乎婿,如果是,直接返回false壁酬;
2次酌、判斷傳入的參數(shù)和調(diào)用方法的對象是否是同一個對象(this == obj)恨课,如果是,直接返回true岳服;
3剂公、判斷傳入的參數(shù)指向的對象所屬的類和調(diào)用方法的對象的類是否相同(this.getClass() == obj.getClass()),如果不同吊宋,直接返回false纲辽;
4、將傳入的參數(shù)obj強制向下轉(zhuǎn)型為調(diào)用方法的對象所在的類型璃搜,然后比較兩個對象中各個應(yīng)該比較的成員變量的值是否相等(具體比較哪些成員變量的值拖吼,根據(jù)需求而定)