淺談Java內部類

如果文章對你有所幫助,請點喜歡并關注,這將是我最大的動力,謝謝

  • 為什么要有內部類

1.內部類是為了更好的封裝,把內部類封裝在外部類里,不允許同包其他類訪問
2.內部類中的屬性和方法即使是外部類也不能直接訪問
3.相反內部類可以直接訪問外部類的屬性和方法,即使private
4.利于回調函數的編寫。 PS:回調函數是函數的迭代
5.當描述事物,如身體里的大腦時,大腦在身體內部,可以通過內部類直觀描述

  • 內部類特點

1.內部類對象不僅指向該內部類,還指向實例化該內部類的外部類對象的內存。

zz.png

2.內部類和普通類一樣可以重寫Object類的方法,如toString方法;并且有構造函數,執行順序依舊是先初始化屬性,再執行構造函數
3.在編譯完之后,會出現(外部類.class)和(外部類﹩內部類.class)兩個類文件名。
4.內部類可以被修飾為private,只能被外部類所訪問。事實上一般也都是如此書寫。
5.內部類可以被寫在外部類的任意位置,如成員位置,方法內。

  • 內部類對象的建立

1在同包其他類 以及main方法中(前提要內部類沒有被修飾成private,所以一般不采用)

1)先創建外部類對象,再通過外部類對象創建內部類
Out outer = new Out();
Out.In inner = outer.new In(); //第一個Out是為了說明該內部類到底屬于哪個外部類
2)通過匿名外部類創建內部類
Out.In inner = new Out().new In();

2在外部類里

可直接創建對象,如 In inner = new In(); 或者直接new In();

  • 內部類的訪問

1.靜態時,靜態內部類只能訪問外部類靜態成員;非靜態內部類都可以直接訪問。(原因是:內部類有一個外部類名.this的指引)當訪問外部類靜態成員出現重名時,通過(外部類名.靜態成員變量名)訪問。如,Out.show();
2.重名情況下,非靜態時,內部類訪問自己內部類通過this.變量名。訪問外部類通過(外部類名.this.變量名)訪問 。如Out.this.show();
3.在沒有重名的情況下,無論靜態非靜態,內部類直接通過變量名訪問外部成員變量。

  • 外部類的訪問

1.內部類為非靜態時,外部類訪問內部類,必須建立內部類對象。建立對象方法,如前所述。
2.1 內部類為靜態時,** 外部類訪問非靜態成員,通過(外部類對象名.內部類名.方法名)訪問,如new Out().In.function();
2.2 內部類為靜態時,
外部類訪問靜態成員時,直接通過(外部類名.內部類名.方法名)**
,如 Out.In.funchtion();
PS:當內部類中定義了靜態成員時,內部類必須是靜態的;當外部靜態方法訪問內部類時,內部類也必須是靜態的才能訪問。

  • 內部類分類

  • 1成員內部類

也是最常規的內部類。該內部類相當于位于外部類的成員的位置。該內部類可以訪問外部類的所有成員和方法,即使是private.

  • 2靜態內部類

1)該類被修飾為static。同時作為靜態內部類,他不能訪問外部類非靜態的成員或方法。
2)訪問方式如上所述。
3)一般書寫靜態類時,不涉及成員變量。

  • 3方法內部類

類被創建在外部類方法中
1)可以訪問外部類中的成員
2)不能被static private 修飾,因為他不再是成員位置,只有成員才能被修飾為static...
3)因此內部類不能有靜態成員
4)內部類要訪問外部方法中的局部變量時,該局部變量需要被修飾成final。

  • 4匿名內部類

1)就是一個內部類的簡化版
2)定義匿名內部類的前提是,該類必須繼承一個外部類或者實現接口。
具體實現如下圖
這是一個繼承類的正常版,一共分為這幾步


1.png

通過匿名內部類將一步到位實現該操作

2.png

PS:因為內部類是匿名的,也就是沒有名字,所以該類一次只能調用一個方法,通常在寫程序時也是如此,這也正是他優點,在只寫一個內部類調用方法時,他可以使整個代碼看上去很簡潔。
2015.8.26更新
匿名內部類在Swing的消息機制中廣泛使用,具體看例子
Swing

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Java 內部類 分四種:成員內部類、局部內部類、靜態內部類和匿名內部類。 1、成員內部類: 即作為外部類的一個成...
    ikaroskun閱讀 1,252評論 0 13
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評論 18 399
  • 局部內部類 局部內部類是內部類的第二種形式,它讓內部類的“隱藏”得更深一層——寫在外部類的方法內部,而不是處于和外...
    java部落閱讀 425評論 0 2
  • 正文 前言說到java內部類,想必大家首先會想到比較常用的“匿名內部類”,但實際上,這只是內部類的其中一種使用方式...
    java部落閱讀 482評論 0 6
  • 2017年2月6號,北京分院的郭安鳳院長組織了北京加盟商伙伴的首次聚會,大家一起共享美味的午餐,暢想2017,一起...
    王小紅_家庭教育閱讀 700評論 0 1