---
# System prepended metadata

title: 內部類別＆靜態內部類別

---

# 內部類別＆靜態內部類別
## 內部類別
### 定義
在類別中再定義類別，稱作內部類別，可以使用外部類別的屬性和方法 ( 包括 `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` 修飾的所有屬性**。

