淺析Java內(nèi)部類——成員內(nèi)部類
內(nèi)部類是什么,簡(jiǎn)單來(lái)說,就是定義在類內(nèi)部的類(一本正經(jīng)的說著廢話)。
一個(gè)正經(jīng)的內(nèi)部類是長(zhǎng)這樣的:
public class Outer { class Inner{ } }
這是為了演示而寫的類,沒有什么luan用,可以看到Inner類置于Outer類的內(nèi)部。
那為什么要大費(fèi)周章的在類內(nèi)部定義一個(gè)類呢?不能在類外部定義類嗎??jī)?nèi)部類跟外部類有什么關(guān)系?
確實(shí),很多時(shí)候,在外部單獨(dú)定義一個(gè)類確實(shí)更加方便,也更加通用,但內(nèi)部類的存在自然有其存在的道理,內(nèi)部類作為寄生在外部類的類,可以自由訪問內(nèi)部類的所有的屬性和方法,有沒有聯(lián)想其我們之前說的繼承,子類可以繼承父類的屬性和方法,但是內(nèi)部類有著更高的訪問權(quán)限,不僅是public屬性,protected屬性,就連private屬性也可以輕松訪問,這樣就不會(huì)讓修飾符限制你的想象了(手動(dòng)滑稽)。
內(nèi)部類也分很多種:成員內(nèi)部類、靜態(tài)內(nèi)部類、局部?jī)?nèi)部類、匿名內(nèi)部類。今天先來(lái)說說第一種:成員內(nèi)部類。
成員內(nèi)部類是最簡(jiǎn)單粗暴的內(nèi)部類,上面那個(gè)栗子中的Inner類就是成員內(nèi)部類,相比普通的類,成員內(nèi)部類是不能有static修飾的成員或者方法的,因?yàn)槌蓡T內(nèi)部類是寄生在外部類中的,所以必須先有外部類實(shí)例才能有成員內(nèi)部類。在外部創(chuàng)建內(nèi)部類對(duì)象時(shí),姿勢(shì)也不太一樣,看起來(lái)像是這個(gè)樣子的:
public class Test { public static void main(String[] args) { Outer.Inner inner = new Outer().new Inner(); } }
在內(nèi)部類中可以訪問外部類的方法和屬性,外部類也可以訪問內(nèi)部類的方法和屬性,舉個(gè)栗子:
public class Outer { private int num; private Inner inner; Outer(){ num = 1; inner = new Inner(); } public void print(){ System.out.println("Outer.print()"); System.out.println(inner.num); System.out.println(num); } class Inner{ private int num; Inner(){ num = 2; } public void print(){ System.out.println("Inner.print()"); System.out.println(this.num); System.out.println(Outer.this.num); } } }
public class Test { public static void main(String[] args) { Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); outer.print(); inner.print(); } }
輸出如下:
Outer.print()
3
1
Inner.print()
3
1
外部類訪問內(nèi)部類的姿勢(shì)是先生成內(nèi)部類實(shí)例,然后就能訪問所有方法和屬性,內(nèi)部類訪問外部類方法和屬性則直接使用Outer.屬性/方法名 即可。
在這個(gè)栗子中,我們可以看到內(nèi)部了Inner可以對(duì)外圍類Outer的屬性進(jìn)行無(wú)限制的訪問,盡管它是private修飾的。因?yàn)楫?dāng)我們?cè)趧?chuàng)建某個(gè)外圍類的內(nèi)部類對(duì)象時(shí),會(huì)往內(nèi)部類傳入一個(gè)外部類的引用,只要我們?cè)谠L問外部類的成員時(shí),就會(huì)用這個(gè)引用來(lái)選擇外圍類的成員。引用內(nèi)部類的時(shí)候,需要使用Outer.Inner這樣的形式來(lái)聲明,而不能直接使用Inner來(lái)聲明(除了在Outer類中),當(dāng)需要使用到內(nèi)部類的時(shí)候,還是推薦使用getInnerInstance的方式來(lái)獲取,特別是當(dāng)內(nèi)部類只有無(wú)參構(gòu)造器的時(shí)候:
public class Outer { private int num; private Inner inner; Outer(){ num = 1; inner = new Inner(); } public Inner getInnerInstance() { return new Inner(); } public void print(){ System.out.println("Outer.print()"); System.out.println(inner.num); System.out.println(num); } public class Inner{ private int num; Inner(){ num = 2; } public void print(){ System.out.println("Inner.print()"); System.out.println(this.num); System.out.println(Outer.this.num); } } }
public class Test { public static void main(String[] args) { Outer outer = new Outer(); Outer.Inner inner = outer.getInnerInstance(); outer.print(); inner.print(); } }
這樣的話,就能更好的封裝了。
當(dāng)然,內(nèi)部類跟外部類還有一個(gè)很重要區(qū)別:內(nèi)部類可以用private修飾,而外部類是不能使用private修飾的。如果內(nèi)部類僅僅在類內(nèi)部使用時(shí),使用private修飾后,就可以更好的隱藏內(nèi)部信息。
至此,內(nèi)部類的第一部分講解完畢,歡迎大家繼續(xù)關(guān)注。
以上就是淺析Java內(nèi)部類——成員內(nèi)部類的詳細(xì)內(nèi)容,更多關(guān)于Java 成員內(nèi)部類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springboot controller無(wú)效的處理方案
這篇文章主要介紹了springboot controller無(wú)效的處理方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10SpringBoot實(shí)現(xiàn)MapperScan添加動(dòng)態(tài)配置(占位符)
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)MapperScan添加動(dòng)態(tài)配置(占位符),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。2022-01-01Java?List集合取交集的8種不同實(shí)現(xiàn)方式總結(jié)
工作中經(jīng)常遇到需要取兩個(gè)集合之間的交集、差集情況,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Java?List集合取交集的8種不同實(shí)現(xiàn)方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04使用java寫的矩陣乘法實(shí)例(Strassen算法)
這篇文章主要給大家介紹了關(guān)于如何使用java寫的矩陣乘法(Strassen算法)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02mybatis主表與明細(xì)表一對(duì)多的同時(shí)插入操作方法
對(duì)主表(采購(gòu)申請(qǐng)表)和明細(xì)表(申請(qǐng)物資表)同時(shí)進(jìn)行插入操作insert,怎么實(shí)現(xiàn)呢,下面給大家分享mybatis主表與明細(xì)表一對(duì)多的同時(shí)插入操作方法,感興趣的朋友一起看看吧2023-02-02Java中SSM框架實(shí)現(xiàn)增刪改查功能代碼詳解
這篇文章主要介紹了Java中SSM框架實(shí)現(xiàn)增刪改查功能代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07JAVA實(shí)現(xiàn)Base64編碼的三種方式
本文主要介紹了JAVA實(shí)現(xiàn)Base64編碼的三種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06