1.定義:
將一個類的定義放在另一個類的定義內部,與之對應包含內部類的類被稱為外部類
2.內部類的作用:
(1)內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類;
(2)內部類的方法可以直接存取外部類的所有資料,包括私人的資料;
(3)內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便;
(4)每個內部類都能獨立的繼承一個(介面)實現,無論外部類是否已經繼承了個(介面)實現,對於內部類沒有影響;
(5)內部類不能被覆蓋,但可通過繼承實現。
3.普通內部類(成員內部類)
(1)使用方法:
內部類定義在外部類的內部,相當於外部類的一個成員變量的位置,內部類可以使用任意存取控制符,如 public 、 protected 、 private 等;
內部類中定義的方法可以直接存取外部類中的資料,而不受存取控制符的影響
定義了成員內部類後,必須使用外部類對象來建立內部類對象,而不能直接去 new 一個內部類對象,
即:內部類 對象名 = 外部類對象.new 內部類( );
例:
Outer o = new Outer(); //建立外部類對象Inner io = o.new Inner(); //建立內部類對象
編譯上面的程式後,會發現產生了兩個 .class ⽂檔案;外部類對應的class檔案是:外部類名 .class ,內部類對應的class檔案是:外部類名$內部類名.class
(2)注意:
外部類是不能直接使用內部類的成員和方法,可先建立內部類的對象,然後通過內部類的對象來訪問其成員變量和方法。
如果外部類和內部類具有相同的成員變量或方法,內部類預設訪問自己的成員變數量或方法,如果要訪問外部類的成員變數量,可以使用 this 關鍵字。
例:
public class Employee { private String name = "Redis"; class Mannger { private String name = "Netty"; public void getName(){ String name = "Lee"; System.out.println("局部變數:" + name); System.out.println("內部類變數:" + this.name); System.out.println("外部類變數:" + Employee1.this.name); } } public static void main(String[] args) { Employee e = new Employee(); Mannger m = e.new Mannger(); m.getName(); }}
運行結果:
局部變數:Lee內部類變數:Netty外部類變數:Redis
4.靜態內部類
(1)定義:由static關鍵字修飾的內部類。
(2)特點:
靜態內部類不能直接存取外部類的非靜態成員,但可以通過new 外部類().成員 的方式訪問
如果外部類的靜態成員與內部類的成員名稱相同,可通過“類名.靜態成員”訪問外部類的靜態成員;若不同,則可通過“成員名”直接調.用外部類的靜態成員
建立靜態內部類的對象時,不需要外部類的對象,可以直接建立
即:內部類 對象名= new 內部類();
例:
public class Employee2 { private static String name = "Redis"; static class Mannger { private String name = "Netty"; public String getName(){ return this.name; } } public static void main(String[] args) { Mannger m = new Mannger(); System.out.println(m.getName()); }}
運行結果:
Netty
5.方法內部類
(1)定義:
內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用。
(2)局限:
由於方法內部類不能在外部類的方法以外的地方使用,因此方法內部類不能使用存取控制符和 static 修飾符。
例:
public class Parcel { public String destination() { String label = "top"; class Destination { public void readLabel() { System.out.println("方法內部類。"); } } new Destination().readLabel(); return label; } public static void main(String[] args) { Parcel p = new Parcel(); System.out.println(p.destination()); }}
運行結果:
方法內部類。top
6.匿名內部類
(1)定義:
只建立內部類的一個對象,沒有名稱。
(2) 注意:
使用匿名內部類時,我們必須是繼承一個類或者實現一個介面,但是兩者不可兼得,同時也只能繼承一個類或者實現一個介面。
匿名內部類中是不能定義建構函式的。
匿名內部類中不能存在任何的靜態成員變數和靜態方法。
匿名內部類為局部內部類,所以局部內部類的所有限制同樣對匿名內部類生效。
匿名內部類不能是抽象的,它必須要實現繼承的類或者實現的介面的所有抽象方法。
匿名內部類不能訪問外部類方法中的局部變數,除非變數被聲明為final類型
例:
public class Bird { public Goose getName(int n){ return new Goose (){ int number = 6 + n; public int getNumber(){ return number; } }; } public static void main(String[] args) { Bird bird = new Bird(); Goose goose = bird.getName(3); System.out.println(goose.getNumber()); }}interface Goose { int getNumber();}//輸出結果: 9
本人才疏學淺,若有錯誤,請指出~
謝謝。