如果文章對(duì)你有所幫助尖奔,請(qǐng)點(diǎn)喜歡并關(guān)注鹊杖,這將是我最大的動(dòng)力商膊,謝謝
-
為什么要有內(nèi)部類
1.內(nèi)部類是為了更好的封裝饶囚,把內(nèi)部類封裝在外部類里帕翻,不允許同包其他類訪問
2.內(nèi)部類中的屬性和方法即使是外部類也不能直接訪問
3.相反內(nèi)部類可以直接訪問外部類的屬性和方法,即使private
4.利于回調(diào)函數(shù)的編寫萝风。 PS:回調(diào)函數(shù)是函數(shù)的迭代
5.當(dāng)描述事物嘀掸,如身體里的大腦時(shí),大腦在身體內(nèi)部规惰,可以通過內(nèi)部類直觀描述
-
內(nèi)部類特點(diǎn)
1.內(nèi)部類對(duì)象不僅指向該內(nèi)部類睬塌,還指向?qū)嵗搩?nèi)部類的外部類對(duì)象的內(nèi)存。
2.內(nèi)部類和普通類一樣可以重寫Object類的方法,如toString方法揩晴;并且有構(gòu)造函數(shù)勋陪,執(zhí)行順序依舊是先初始化屬性,再執(zhí)行構(gòu)造函數(shù)
3.在編譯完之后硫兰,會(huì)出現(xiàn)(外部類.class)和(外部類﹩內(nèi)部類.class)兩個(gè)類文件名诅愚。
4.內(nèi)部類可以被修飾為private,只能被外部類所訪問劫映。事實(shí)上一般也都是如此書寫违孝。
5.內(nèi)部類可以被寫在外部類的任意位置,如成員位置泳赋,方法內(nèi)雌桑。
-
內(nèi)部類對(duì)象的建立
1在同包其他類 以及main方法中(前提要內(nèi)部類沒有被修飾成private,所以一般不采用)
1)先創(chuàng)建外部類對(duì)象祖今,再通過外部類對(duì)象創(chuàng)建內(nèi)部類
Out outer = new Out();
Out.In inner = outer.new In(); //第一個(gè)Out是為了說明該內(nèi)部類到底屬于哪個(gè)外部類
2)通過匿名外部類創(chuàng)建內(nèi)部類
Out.In inner = new Out().new In();
2在外部類里
可直接創(chuàng)建對(duì)象校坑,如 In inner = new In(); 或者直接new In();
-
內(nèi)部類的訪問
1.靜態(tài)時(shí),靜態(tài)內(nèi)部類只能訪問外部類靜態(tài)成員;非靜態(tài)內(nèi)部類都可以直接訪問千诬。(原因是:內(nèi)部類有一個(gè)外部類名.this的指引)當(dāng)訪問外部類靜態(tài)成員出現(xiàn)重名時(shí)耍目,通過(外部類名.靜態(tài)成員變量名)訪問。如大渤,Out.show();
2.重名情況下制妄,非靜態(tài)時(shí),內(nèi)部類訪問自己內(nèi)部類通過this.變量名泵三。訪問外部類通過(外部類名.this.變量名)訪問 耕捞。如Out.this.show();
3.在沒有重名的情況下,無論靜態(tài)非靜態(tài)烫幕,內(nèi)部類直接通過變量名訪問外部成員變量俺抽。
-
外部類的訪問
1.內(nèi)部類為非靜態(tài)時(shí)遵绰,外部類訪問內(nèi)部類恩商,必須建立內(nèi)部類對(duì)象。建立對(duì)象方法毅糟,如前所述捷犹。
2.1 內(nèi)部類為靜態(tài)時(shí)弛饭,** 外部類訪問非靜態(tài)成員,通過(外部類對(duì)象名.內(nèi)部類名.方法名)訪問萍歉,如new Out().In.function();
2.2 內(nèi)部類為靜態(tài)時(shí)侣颂,外部類訪問靜態(tài)成員時(shí),直接通過(外部類名.內(nèi)部類名.方法名)**
枪孩,如 Out.In.funchtion();
PS:當(dāng)內(nèi)部類中定義了靜態(tài)成員時(shí)憔晒,內(nèi)部類必須是靜態(tài)的藻肄;當(dāng)外部靜態(tài)方法訪問內(nèi)部類時(shí),內(nèi)部類也必須是靜態(tài)的才能訪問拒担。
-
內(nèi)部類分類
-
1成員內(nèi)部類
也是最常規(guī)的內(nèi)部類嘹屯。該內(nèi)部類相當(dāng)于位于外部類的成員的位置。該內(nèi)部類可以訪問外部類的所有成員和方法从撼,即使是private.
-
2靜態(tài)內(nèi)部類
1)該類被修飾為static州弟。同時(shí)作為靜態(tài)內(nèi)部類,他不能訪問外部類非靜態(tài)的成員或方法低零。
2)訪問方式如上所述呆馁。
3)一般書寫靜態(tài)類時(shí),不涉及成員變量毁兆。
-
3方法內(nèi)部類
類被創(chuàng)建在外部類方法中
1)可以訪問外部類中的成員
2)不能被static private 修飾,因?yàn)樗辉偈浅蓡T位置阴挣,只有成員才能被修飾為static...
3)因此內(nèi)部類不能有靜態(tài)成員
4)內(nèi)部類要訪問外部方法中的局部變量時(shí)气堕,該局部變量需要被修飾成final。
-
4匿名內(nèi)部類
1)就是一個(gè)內(nèi)部類的簡化版
2)定義匿名內(nèi)部類的前提是畔咧,該類必須繼承一個(gè)外部類或者實(shí)現(xiàn)接口茎芭。
具體實(shí)現(xiàn)如下圖
這是一個(gè)繼承類的正常版,一共分為這幾步
通過匿名內(nèi)部類將一步到位實(shí)現(xiàn)該操作
PS:因?yàn)閮?nèi)部類是匿名的誓沸,也就是沒有名字梅桩,所以該類一次只能調(diào)用一個(gè)方法,通常在寫程序時(shí)也是如此拜隧,這也正是他優(yōu)點(diǎn)宿百,在只寫一個(gè)內(nèi)部類調(diào)用方法時(shí),他可以使整個(gè)代碼看上去很簡潔洪添。
2015.8.26更新
匿名內(nèi)部類在Swing的消息機(jī)制中廣泛使用垦页,具體看例子