Java內(nèi)部類(lèi)有什么用?及各類(lèi)內(nèi)部類(lèi)解析

java內(nèi)部類(lèi)有什么用购公?

搬運(yùn)一下oracle文檔:

https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

總結(jié)起來(lái)就是三點(diǎn):

1. 有些類(lèi)只對(duì)另外一個(gè)類(lèi)有用, 這樣可以組合在一起,讓整個(gè)包更精簡(jiǎn)陌知。比如Builder常常作為靜態(tài)內(nèi)部類(lèi)。

2. 增加封裝性掖肋。 比如有兩個(gè)類(lèi)A和B仆葡,B想要access A的成員。 如果將B作為A的內(nèi)部類(lèi)志笼,A的成員可以保持private沿盅,并且B本身也被封裝起來(lái)了。

3. 增加可讀性和維護(hù)性纫溃。讓代碼離它被用到的地方更近了腰涧。

內(nèi)部類(lèi)(inner class)

  1. 擁有外部類(lèi)的引用,這樣內(nèi)部類(lèi)可以訪(fǎng)問(wèn)創(chuàng)建它的外部類(lèi)的內(nèi)容紊浩,甚至包括私有變量南窗。
  2. 一旦編譯成功,就會(huì)成為完全不同的兩類(lèi)郎楼。
    對(duì)于一個(gè)名為outer的外部類(lèi)和inner的內(nèi)部類(lèi)万伤,編譯完之后出現(xiàn)outer.class和outer$inner.class兩類(lèi)。
  3. 如果在外部類(lèi)外部訪(fǎng)問(wèn)內(nèi)部類(lèi),用out.inner
    在外部類(lèi)外部要生成一個(gè)內(nèi)部類(lèi)對(duì)象:Outer.Inner in = Outer.new.Inner()
  4. 外部類(lèi)可以訪(fǎng)問(wèn)內(nèi)部類(lèi)的private成員呜袁,神奇不神奇敌买。
    編譯器實(shí)現(xiàn)的時(shí)候是這樣的:Outer類(lèi)和Inner類(lèi)不再是嵌套結(jié)構(gòu),而是變?yōu)橐粋€(gè)包中的兩個(gè)類(lèi)阶界,然后虹钮,對(duì)于private變量的訪(fǎng)問(wèn)聋庵,編譯器會(huì)生成一個(gè)accessor函數(shù).......
  5. 非靜態(tài)內(nèi)部類(lèi)不能有靜態(tài)數(shù)據(jù)、靜態(tài)方法芙粱、靜態(tài)內(nèi)部類(lèi)祭玉。
    為啥呢?因?yàn)榇号希庆o態(tài)內(nèi)部類(lèi)的訪(fǎng)問(wèn)必須通過(guò)外部類(lèi)的實(shí)例脱货,所以要訪(fǎng)問(wèn)非靜態(tài)內(nèi)部類(lèi)的靜態(tài)方法,必須先實(shí)例化內(nèi)部類(lèi)和外部類(lèi)律姨,這樣就和靜態(tài)成員的設(shè)計(jì)是違背的振峻。

靜態(tài)內(nèi)部類(lèi)(靜態(tài)嵌套類(lèi))(nested class)

  1. 實(shí)際上是一種外部類(lèi),因?yàn)榕c外部類(lèi)的實(shí)例無(wú)關(guān)
  2. 定義在類(lèi)中择份,方法外
  3. 只能訪(fǎng)問(wèn)外部類(lèi)的靜態(tài)成員(可以訪(fǎng)問(wèn)私有的靜態(tài)成員)
  4. new的時(shí)候不需要外部類(lèi)成員:Outer.Inner in = new Outer.Inner();

局部?jī)?nèi)部類(lèi)

  1. 在一個(gè)方法甚至一個(gè)代碼塊之內(nèi)扣孟。

  2. 可以被final或abstract修飾

  3. 不能含有靜態(tài)成員

  4. 局部?jī)?nèi)部類(lèi)訪(fǎng)問(wèn)外部類(lèi)方法的局部變量要求其必須為final。
    局部變量是隨著方法的調(diào)用而調(diào)用荣赶,隨著調(diào)用完畢而消失凤价。而堆內(nèi)存的對(duì)象內(nèi)容并不會(huì)立即消失。
    或者簡(jiǎn)單的來(lái)說(shuō)是作用域的問(wèn)題拔创。就好像方法外面做的事情并不能改變方法內(nèi)才定義的變量料仗,因?yàn)槟悴⒉恢婪椒ɡ锩孢@個(gè)時(shí)候已經(jīng)存在了這個(gè)局部變量了沒(méi)有。在這個(gè)內(nèi)部類(lèi)中方法里面的本地變量是失效的伏蚊,也就是不在作用域內(nèi),所以是不能夠訪(fǎng)問(wèn)的格粪。但是為什么這里用final卻又可以訪(fǎng)問(wèn)呢躏吊? 因?yàn)镴ava采用了一種copy local variable的方式來(lái)實(shí)現(xiàn),也就是說(shuō)把定義為final的局部變量拷貝過(guò)來(lái)用帐萎,而引用的也可以拿過(guò)來(lái)用比伏,只是不能重新賦值。從而造成了可以access local variable的假象疆导,而這個(gè)時(shí)候由于不能重新賦值赁项,所以一般不會(huì)造成不可預(yù)料的事情發(fā)生。
    則java編譯器則會(huì)在內(nèi)部類(lèi)NewAge內(nèi)生成一個(gè)外部變量的拷貝澈段,而且可以既可以保證內(nèi)部類(lèi)可以引用外部屬性悠菜,又能保證值的唯一性
    也就是拷貝了一個(gè)變量的副本,提供給局部?jī)?nèi)部類(lèi),這個(gè)副本的生命周期和局部?jī)?nèi)部類(lèi)一樣長(zhǎng)败富,并且這個(gè)副本不可以修改悔醋,保證了數(shù)據(jù)的同步
    注意:在Java8 中,被局部?jī)?nèi)部類(lèi)引用的局部變量兽叮,默認(rèn)添加final芬骄,所以不需要添加final關(guān)鍵詞

匿名內(nèi)部類(lèi)

  1. 匿名類(lèi)(Anonymouse Class)是一種沒(méi)有類(lèi)名的內(nèi)部類(lèi)猾愿,多用在事件處理的程序中。有時(shí)用戶(hù)需要定義一個(gè)類(lèi)账阻,且只想在程序中定義該類(lèi)的一個(gè)對(duì)象蒂秘,并把它作為參數(shù)傳遞給一個(gè)方法。只要該類(lèi)是一個(gè)現(xiàn)有類(lèi)的派生或?qū)崿F(xiàn)一個(gè)接口淘太,就可以使用匿名類(lèi)姻僧。匿名類(lèi)定義短而簡(jiǎn)單且使用方便,但不易過(guò)多使用琴儿,它會(huì)引起程序代碼的復(fù)雜化而不易理解
  2. 沒(méi)有名字段化,所以不能定義構(gòu)造方法。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末造成,一起剝皮案震驚了整個(gè)濱河市显熏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晒屎,老刑警劉巖喘蟆,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鼓鲁,居然都是意外死亡蕴轨,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)骇吭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)橙弱,“玉大人,你說(shuō)我怎么就攤上這事燥狰〖辏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵龙致,是天一觀(guān)的道長(zhǎng)蛀缝。 經(jīng)常有香客問(wèn)我,道長(zhǎng)目代,這世上最難降的妖魔是什么屈梁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮榛了,結(jié)果婚禮上在讶,老公的妹妹穿的比我還像新娘。我一直安慰自己霜大,他們只是感情好真朗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著僧诚,像睡著了一般遮婶。 火紅的嫁衣襯著肌膚如雪蝗碎。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天旗扑,我揣著相機(jī)與錄音蹦骑,去河邊找鬼。 笑死臀防,一個(gè)胖子當(dāng)著我的面吹牛眠菇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播袱衷,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼捎废,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了致燥?” 一聲冷哼從身側(cè)響起登疗,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嫌蚤,沒(méi)想到半個(gè)月后辐益,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脱吱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年智政,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箱蝠。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡续捂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宦搬,到底是詐尸還是另有隱情牙瓢,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布床三,位于F島的核電站,受9級(jí)特大地震影響杨幼,放射性物質(zhì)發(fā)生泄漏撇簿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一差购、第九天 我趴在偏房一處隱蔽的房頂上張望四瘫。 院中可真熱鬧,春花似錦欲逃、人聲如沸找蜜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)洗做。三九已至弓叛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诚纸,已是汗流浹背撰筷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畦徘,地道東北人毕籽。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像井辆,于是被迫代替她去往敵國(guó)和親关筒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容