Java中的內部類總結

內部類( Inner Class )就是定義在另外一個類裏面的類。與之對應,包含內部類的類被稱爲外部類。
主要作用:

  1. 內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類
  2. 內部類的方法可以直接訪問外部類的所有數據,包括私有的數據
  3. 內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便

種類:

  1. 成員內部類
  2. 靜態內部類
  3. 方法內部類
  4. 匿名內部類

成員內部類:
內部類中最常見的就是成員內部類,也稱爲普通內部類。我們來看如下代碼:
在這裏插入圖片描述
運行結果:
在這裏插入圖片描述
從上面的代碼中我們可以看到,成員內部類的使用方法:

1、 Inner 類定義在 Outer 類的內部,相當於 Outer 類的一個成員變量的位置,Inner 類可以使用任意訪問控制符,如 public 、 protected 、 private 等

2、 Inner 類中定義的 test() 方法可以直接訪問 Outer 類中的數據,而不受訪問控制符的影響,如直接訪問 Outer 類中的私有屬性a

3、 定義了成員內部類後,必須使用外部類對象來創建內部類對象,而不能直接去 new 一個內部類對象,即:內部類 對象名 = 外部類對象.new 內部類( );

4、 編譯上面的程序後,會發現產生了兩個 .class 文件

其中,第二個是外部類的 .class 文件,第一個是內部類的 .class 文件,即成員內部類的 .class 文件總是這樣:外部類名$內部類名.class

另外,友情提示:
1、 外部類是不能直接使用內部類的成員和方法
在這裏插入圖片描述
可先創建內部類的對象,然後通過內部類的對象來訪問其成員變量和方法。

2、 如果外部類和內部類具有相同的成員變量或方法,內部類默認訪問自己的成員變量或方法,如果要訪問外部類的成員變量,可以使用 this 關鍵字。如:
在這裏插入圖片描述
運行結果:
在這裏插入圖片描述
靜態內部類:
是 static 修飾的內部類,這種內部類的特點是:

1、 靜態內部類不能直接訪問外部類的非靜態成員,但可以通過 new 外部類().成員 的方式訪問

2、 如果外部類的靜態成員與內部類的成員名稱相同,可通過“類名.靜態成員”訪問外部類的靜態成員;如果外部類的靜態成員與內部類的成員名稱不相同,則可通過“成員名”直接調用外部類的靜態成員

3、 創建靜態內部類的對象時,不需要外部類的對象,可以直接創建 內部類 對象名= new 內部類();
在這裏插入圖片描述
運行結果:
在這裏插入圖片描述
方法內部類:
就是內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用。
在這裏插入圖片描述
一定要注意哦:由於方法內部類不能在外部類的方法以外的地方使用,因此方法內部類不能使用訪問控制符和 static 修飾符。
匿名內部類:
使用它我們必須要繼承一個父類或者實現一個接口,當然也僅能只繼承一個父類或者實現一個接口。同時它也是沒有class關鍵字,這是因爲匿名內部類是直接使用new來生成一個對象的引用。當然這個引用是隱式的。
格式:
new 父類構造器(參數列表)|實現接口()
{
//匿名內部類的類體部分
}
接口是不能被new的,匿名內部類new的時候,後面帶了一對花括號,表示new的是這個接口的實現類,這個實現類是沒有名字的。
注意:
1、使用匿名內部類時,我們必須是繼承一個類或者實現一個接口,但是兩者不可兼得,同時也只能繼承一個類或者實現一個接口。
2、匿名內部類中是不能定義構造函數的。
3、匿名內部類中不能存在任何的靜態成員變量和靜態方法。
4、匿名內部類爲局部內部類,所以局部內部類的所有限制同樣對匿名內部類生效。
5、匿名內部類不能是抽象的,它必須要實現繼承的類或者實現的接口的所有抽象方法。
參考:
https://www.cnblogs.com/chenssy/p/3390871.html
https://www.imooc.com/code/2096

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章