# 內部類別&靜態內部類別 ## 內部類別 ### 定義 在類別中再定義類別,稱作內部類別,可以使用外部類別的屬性和方法 ( 包括 `private` )。 ```[java]= // MyClass.java public class MyClass { private String a; public MyClass() { this.a = "外部"; } public String getA() { return a; } // 內部類別 public class InnerClass { private String a; public InnerClass() { this.a = "內部"; } public String getA() { return a; } public String getOutsideA() { return MyClass.this.a; // 調用外部類別 private 的屬性 } } } ``` ```[java]= // Main.java public class Main { public static void main(String[] args) { MyClass myClass = new MyClass(); MyClass.InnerClass innerClass = myClass.new InnerClass(); System.out.println(myClass.getA()); System.out.println(innerClass.getA()); System.out.println(innerClass.getOutsideA()); } } ``` 執行結果 ![內部類別](https://i.imgur.com/QLkyJ6v.png) 外部類別也能存取內部類別 `private` 的屬性,所以上面的 `getA` 可以改寫成下面: ```[java]= public String getA() { InnerClass innerClass = new InnerClass(); return a + " " + innerClass.a; } ``` 因為內部類別需要依附外部類別實體的特性,使得***實務上通常並不會讓內部類別可以在其他類(如Main)之中被創建***。 *** ## 靜態內部類別 ### 定義 將內部類別設定成靜態,此時就不需依賴外部類別實體,可以在尚未創建外部類別實體時創建內部類別。 ```[java]= // MyCalss.java public class MyClass { private String a; public MyClass() { this.a = "外部"; } public String getA() { InnerClass innerClass = new InnerClass(); return a + " " + innerClass.a; } // 靜態內部類別 public static class InnerClass { private String a; public InnerClass() { this.a = "內部"; } public String getA() { return a; } } } ``` ```[java]= // Main.java public class Main { public static void main(String[] args) { // 不需依賴外部類別實體即可宣告 MyClass.InnerClass innerClass = new MyClass.InnerClass(); System.out.println(innerClass.getA()); } } ``` 另外也因為不需依賴外部類別實體,所以無法使用外部類別 `.this` 來調用屬性,但**外部類別一樣可以存取內部類別中包含 `private` 修飾的所有屬性**。