4 分鐘閱讀

java-巢狀類別

建立一個java的Console範本程式
Main稱為外層類別,裡面的類別稱為巢狀類別
在類別裡面再定義一個Class1
然後去new,會得到一個錯誤
com.company.Main.this’ cannot be referenced from a static context

public class Main {
  class Class1 {

  }
  public static void main(String[] args) {
      // write your code here
      Class1 c1 = new Class1();
  }
}

這個令人疑惑的錯誤
其實 Class1 c1 = new Class1();
編譯器會加上this,Class1 c1 = this.new Class1();

但這樣為什麼會造成錯誤?
因為this指向的Main還未實例化
可以先建立Main物件,再去實例化Class1

Main m = new Main();
Class1 c1 = m.new Class1();

你也可以把巢狀類別定義為static

Class2 c2 = new Main.Class2(); 

巢狀類別的成員變數

static或non-static巢狀類別
都可以定義static和non-static members

巢狀類別的存取範圍

non-static巢狀類別
可以存取

  • 在最高階層內的任何static成員或者static類別的static成員
  • 最高階層的non-static成員
  • 自己類別內的成員

static巢狀類別
可以存取

  • 在最高階層內的任何static成員或者static類別的static成員
  • 自己類別內的成員

區域巢狀類別

方法也可以定義類別,稱為區域巢狀類別
這個可以用在單一用途,確定其他地方都不用到

標籤:

更新時間: