首頁 > 軟體

飽受大廠摧殘的師兄,耗時3天整理的Java筆記,助我拿到阿里offer

2021-05-20 16:00:46

今日分享開始啦,請大家多多指教~

巢狀類分類

靜態內部類(靜態巢狀類/靜態成員類/靜態類)內部類(非靜態巢狀類)內部成員類本地內部類匿名內部類巢狀介面靜態內部類

重要的結論:如果一個類被聲明為static(即static修飾class),只有一種情況,該類是靜態內部類。

1. 靜態內部類中能聲明哪些類,變數和方法?

沒有限制,可以聲明各種類型的類,變數,方法和靜態程式碼塊,細分為:

類:

列舉類靜態內部類內部類介面變數:

靜態變數例項變數方法:

靜態方法例項方法靜態程式碼塊2. 靜態內部類能訪問外圍類的哪些變數和方法?

靜態內部類可以訪問外圍類的任何成員,包括外圍類中聲明為private的成員,分為:

外圍類的靜態變數和方法(含私有):直接訪問外圍類的例項變數和方法(含私有):通過外圍類的例項物件進行訪問靜態內部類類似類的靜態變數,不需要依賴外圍類的例項物件而存在,可以看作是頂層類,可以直接通過外圍類來訪問。3. 繼承方面

在繼承方面,靜態內部類與外圍類沒什麼分別,在訪問許可權允許的情況下:任何類都可以繼承靜態內部類,靜態內部類也可以繼承任何類(類沒有聲明為final)或實現任何介面。

內部類

1. 細分類

內部成員類本地內部類(本地類/局部類)匿名內部類(匿名類)2. 內部類中能聲明哪些類,變數和方法?

內部類可以聲明例項變數,例項方法,final類型的靜態變數。內部類不可以聲明靜態成員:包括靜態變數,靜態方法,靜態內部類,巢狀介面,靜態初始化塊。細分為:

類:

只能聲明內部類不能聲明列舉類,靜態內部類,介面變數:

只能聲明例項變數,final類型靜態變數不能聲明靜態變數方法:

只能聲明例項方法不能聲明靜態方法不能聲明靜態程式碼塊3. 內部類能訪問外圍類的哪些變數和方法?

沒有限制,外圍類的所有變數和方法(含私有)都可以直接訪問。

4. 內部類是怎樣繫結外圍物件?

總結: 創建內部類物件(呼叫內部類的構造器)時,編譯器會隱式地在內部類中聲明一個final的外圍類類型的成員變數,然後將外圍類的物件,通過內部類的構造器傳遞給該final成員變數,用來將內部類物件繫結到外圍類物件。

創建內部類物件,如下:

創建內部類物件時,系統會自動將外圍類的物件(outer)作為參數傳入內部類的構造器中,可認為是下面的方式:

Outer.Inner inner = outer.new Inner(outer);

5. 繼承方面

在訪問許可權允許的情況下:內部類可以繼承任何類,也可以由任何類繼承。

問:那內部類與靜態內部類在繼承方面有什麼區別呢?

答:內部類的物件總是要依賴於外部物件,因此一個類A繼承了一個內部類,則類A也必須要與內部類的外圍類物件相繫結,否則產生編譯錯誤。

1.反例:產生編譯錯誤

2.錯誤的原因:

想要創建A類物件,即A a = new A(); 會呼叫A類構造器,A類繼承內部類(Outer.Inner),則會呼叫內部類的構造器。

這時沒有有效的外圍類物件,則無法實現內部類物件與外圍類物件的繫結,產生編譯錯誤。

3.修正

方法一:在A類構造器中傳遞一個外圍類的引用,通過外圍類物件來呼叫內部類的構造器,

就相當於將外圍類的物件傳遞給了內部類的構造器,實現了內部類物件與外圍類物件的繫結。

方法二:外部類繼承外部類,內部類繼承內部類

創建A類的內部類InnerA物件:

創建內部類A.InnerA物件時,需要繫結外圍物件,a引用就是外圍類的物件,

內部類A.InnerA繼承了另外一個內部類Outer.Inner,在A.InnerA呼叫父類構造器時,也需要傳遞父類的外圍類(Outer)物件,

A類繼承了Outer類,因為子類的物件可以當作父類的物件來使用,因此a引用也是另一個內部類Outer.Inner的外圍物件。

6. 本地內部類

本地內部類:就是在方法,構造器,初始化塊中聲明的類。

本地內部類不是類的成員,從結構上類似一個局部變數,因此不能使用訪問修飾符(public,protected,private),也不能使用static修飾。

問:本地內部類聲明在例項環境(例項方法,構造器,例項初始化塊)和靜態環境中有什麼區別呢?

答:例項環境:本地內部類需要與外圍類繫結,即會在類中隱式生成一個final的引用。

靜態環境:本地內部類不需要與外圍類繫結。

巢狀介面

巢狀介面:就是在類或者介面中聲明的介面。

不管聲明在類中,還是介面中,巢狀介面永遠都是靜態的。當類實現了某個介面時,不需要實現巢狀介面的方法。今日份分享已結束,請大家多多包涵和指點!


IT145.com E-mail:sddin#qq.com