Java中的內(nèi)部類宜咒,你真的理解嗎

概述

不知道大家在平時(shí)的開發(fā)過程中或者源碼里是否留意過內(nèi)部類,那有思考過為什么要有內(nèi)部類把鉴,內(nèi)部類都有哪幾種形式故黑,靜態(tài)內(nèi)部類和普通內(nèi)部類有什么區(qū)別呢?本篇文章主要帶領(lǐng)大家理解下這塊內(nèi)容纸镊。

內(nèi)部類介紹和分類

顧名思義倍阐,內(nèi)部類是指一個(gè)類在另外一個(gè)類的內(nèi)部,是定義在另一個(gè)類中的類逗威。根據(jù)類的位置和屬性不同峰搪,可以分為下面幾種。

常規(guī)內(nèi)部類

@DatapublicclassTree{privateString treeName;privateString treeType;privateList leafs;@DatapublicclassLeaf{privateString color;privateString leafSize;publicvoidshow(){? ? ? ? ? ? System.out.println("tree name: "+ Tree.this.treeName);? ? ? ? ? ? System.out.println("tree name: "+ treeName);? ? ? ? }? ? }publicstaticvoidmain(String[] args){? ? ? ? Tree tree =newTree();? ? ? ? Leaf leaf = tree.new Leaf();? ? }}復(fù)制代碼

上面就是一個(gè)內(nèi)部類的例子凯旭,Leaf是Tree的內(nèi)部類概耻。

Tree.this.treeName

Tree tree =newTree();Leaf leaf = tree.newLeaf();復(fù)制代碼

字節(jié)碼分析:

我們查看下內(nèi)部類的字節(jié)碼,如下圖:

我們看到內(nèi)部類Leaf的構(gòu)造方法init罐呼,實(shí)際上會(huì)隱式地將外部對(duì)象傳入鞠柄,初始化,這樣才能在內(nèi)部類中訪問嫉柴。

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

局部?jī)?nèi)部類厌杜,比如只有在一個(gè)方法內(nèi)部創(chuàng)建。

@DatapublicclassTree{privateString treeName;privateString treeType;privateList leafs;publicvoidtreeRoot(intheight){classTreeRoot{privateintrootHeight;publicvoidshowRootHeight(){this.rootHeight = height;? ? ? ? ? ? ? ? System.out.println("root height "+ height);? ? ? ? ? ? }? ? ? ? }? ? ? ? TreeRoot root =newTreeRoot();? ? ? ? root.showRootHeight();? ? }}復(fù)制代碼

局部類不能用public或private訪問說明符進(jìn)行聲明计螺,因?yàn)樽饔糜蛑辉谶@個(gè)局部夯尽,沒有必要。

局部?jī)?nèi)部類可以完全將自己隱藏起來登馒,體現(xiàn)良好的封裝性匙握。

局部?jī)?nèi)部類可以直接訪問方法的變量。

匿名內(nèi)部類

匿名內(nèi)部類陈轿,就更加簡(jiǎn)潔了圈纺,連類名都省略了, 這個(gè)配合lambda食用,非常簡(jiǎn)便麦射,想必大家也經(jīng)常使用了蛾娶。

publicstaticvoidmain(String[] args){? ? ? ? Runnable runnable =newRunnable() {? ? ? ? ? ? @Overridepublicvoidrun(){? ? ? ? ? ? ? ? System.out.println("runnable");? ? ? ? ? ? }? ? ? ? };? ? ? ? Runnable runnable2 = () -> System.out.println("runnable");? ? }復(fù)制代碼

匿名內(nèi)部類也體現(xiàn)了良好的封裝性和簡(jiǎn)潔性。

靜態(tài)內(nèi)部類

最后潜秋,再介紹下靜態(tài)內(nèi)部類蛔琅,這個(gè)也使用的非常頻繁。java源碼中也有很多這樣的例子半等,比如HashMap中揍愁,Node節(jié)點(diǎn)就是一個(gè)靜態(tài)內(nèi)部類。

如果用static來修飾一個(gè)內(nèi)部類杀饵,那么就是靜態(tài)內(nèi)部類莽囤。這個(gè)內(nèi)部類屬于外部類本身,但是不屬于外部類的任何對(duì)象切距。因此使用static修飾的內(nèi)部類稱為靜態(tài)內(nèi)部類朽缎。靜態(tài)內(nèi)部類有如下規(guī)則:

靜態(tài)內(nèi)部類不能訪問外部類的實(shí)例成員,只能訪問外部類的類成員谜悟。

外部類可以使用靜態(tài)內(nèi)部類的類名作為調(diào)用者來訪問靜態(tài)內(nèi)部類的類成員话肖,也可以使用靜態(tài)內(nèi)部類對(duì)象訪問其實(shí)例成員。

靜態(tài)內(nèi)部類和普通內(nèi)部類的區(qū)別

我們可以通俗按下面的方式理解:

內(nèi)部類:就是我是你的一部分葡幸,我了解你最筒,我知道你的全部,沒有你就沒有我蔚叨。(所以內(nèi)部類對(duì)象是以外部類對(duì)象存在為前提的)

靜態(tài)內(nèi)部類:就是我跟你沒關(guān)系床蜘,自己可以完全獨(dú)立存在,但是我就借你的殼用一下蔑水,來隱藏自己邢锯。

從字節(jié)碼角度上看,靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類最大的區(qū)別是:非靜態(tài)內(nèi)部類編譯后隱式保存著外部類的引用(就算外部類對(duì)象沒用了也GC不掉)搀别,但是靜態(tài)內(nèi)部類沒有丹擎。

內(nèi)部類的作用

通過上面的了解,我想內(nèi)部類還是有一定的意義的歇父。

內(nèi)部類方法可以訪問該類定義所在的作用域中的數(shù)據(jù)蒂培,包括私有的數(shù)據(jù)。

內(nèi)部類可以對(duì)同一個(gè)包中的其他類隱藏起來庶骄。

其實(shí)內(nèi)部類更多的時(shí)候毁渗,不想把這個(gè)類暴露出去,它可能只是外部類的一個(gè)邏輯組成部分单刁,不需要其他地方知道什么灸异,這時(shí)候我們用內(nèi)部類更加的清楚。

?著作權(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)離奇詭異卡儒,居然都是意外死亡田柔,警方通過查閱死者的電腦和手機(jī)俐巴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硬爆,“玉大人欣舵,你說我怎么就攤上這事∽嚎模” “怎么了缘圈?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)袜蚕。 經(jīng)常有香客問我糟把,道長(zhǎng),這世上最難降的妖魔是什么牲剃? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任遣疯,我火速辦了婚禮,結(jié)果婚禮上凿傅,老公的妹妹穿的比我還像新娘另锋。我一直安慰自己,他們只是感情好狭归,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布夭坪。 她就那樣靜靜地躺著,像睡著了一般过椎。 火紅的嫁衣襯著肌膚如雪室梅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天疚宇,我揣著相機(jī)與錄音亡鼠,去河邊找鬼。 笑死敷待,一個(gè)胖子當(dāng)著我的面吹牛间涵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播榜揖,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼勾哩,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了举哟?” 一聲冷哼從身側(cè)響起思劳,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妨猩,沒想到半個(gè)月后潜叛,有當(dāng)?shù)厝嗽跇淞掷锇l(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
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粪躬。 院中可真熱鬧担败,春花似錦、人聲如沸镰官。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泳唠。三九已至狈网,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笨腥,已是汗流浹背拓哺。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(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)容

  • 關(guān)于java內(nèi)部類的一些總結(jié) 匿名內(nèi)部類了解一下?其實(shí)你每天都在用建峭。 概念 將一個(gè)類聲明在另一個(gè)類的內(nèi)部玻侥,則將這個(gè)...
    Joseph_L閱讀 463評(píng)論 0 1
  • 前言:對(duì)于 JAVA 基礎(chǔ)的內(nèi)容,其實(shí)網(wǎng)上資料挺多的亿蒸,本打算只寫 Android 相關(guān)技術(shù)文章凑兰,但對(duì)于內(nèi)部類這個(gè)基...
    theonlin閱讀 1,352評(píng)論 0 12
  • 今天整理一下內(nèi)部類掌桩,其中包含了內(nèi)部類的特殊形式,對(duì)比普通類有什么區(qū)別和作用姑食,內(nèi)部類和外圍類之間的聯(lián)系波岛,內(nèi)部類的擴(kuò)展...
    _小二_閱讀 617評(píng)論 0 3
  • 1.為什么成員內(nèi)部類可以無條件訪問外部類的成員? 在此之前音半,我們已經(jīng)討論過了成員內(nèi)部類可以無條件訪問外部類的成員则拷,...
    羅占偉David閱讀 890評(píng)論 0 5
  • 內(nèi)部類就是定義在一個(gè)類中的另外一個(gè)類,是一種從屬關(guān)系曹鸠。在沒有實(shí)際了解內(nèi)部類之前煌茬,我始終困惑,為什么要在一個(gè)類中定義...
    Single_YAM閱讀 762評(píng)論 0 11