1. 程式人生 > >【Java】如何建立內部類的例項?

【Java】如何建立內部類的例項?

1.問題:

首先看一段程式碼:

public class Test {

    //建立內部類Test2
    public class Test2 {
        private double r;
    }

    public static void main(String[] args) {
        Test2 myTest2 = new Test2();  //建立Test2類的例項myTest2
    }
}

以上程式碼報錯:

No enclosing instance of type inputTest is accessible. Must qualify the allocation with an enclosing instance of type inputTest (e.g. x.new
A() where x is an instance of inputTest).

2. 分析

主要問題在於main方法是static修飾的靜態方法只能訪問靜態方法和靜態變數,而內部類Test2是動態的,不能被main訪問。
為什麼靜態方法不能訪問類內的動態成員呢?
程式最終都是在記憶體中執行,變數只有在記憶體中佔有一席之地時才會被訪問,類的靜態成員(變態和方法)屬於類本身,在類載入的時候就會分配記憶體,可以通過類名直接去訪問,非靜態成員(變數和方法)屬於類的物件,所以只有在類的物件產生(建立例項)的時候才會分配記憶體,然後通過類的物件去訪問。
簡單說來,靜態方法可以不用建立物件就呼叫,非靜態方法必須有了物件的例項才能呼叫.因此想在靜態方法中引用非靜態方法是不可能的,因為在非靜態方法中沒有物件,因此無法呼叫。

3. 如何正確建立內部類例項?

  • 將內部類宣告為靜態成員
  • 從外部非靜態類呼叫內部類

4. 小結

靜態方法

  • 呼叫:類名.方法名 物件名.方法名
  • 不需要例項化,即不需要建立物件
  • 訪問:訪問本類的成員時,只能訪問靜態變數和靜態方法,不允許訪問例項變數和例項方法
  • (針對靜態變數:可以被一個類的所有例項共享,儲存在公共的記憶體地址,一個物件修改後,所有的物件都會受影響)

例項方法

  • 呼叫:只能用物件名.方法名,不能用類名.方法名
  • 必須例項化,建立物件
  • 訪問:訪問本類的成員時,沒有限制
  • (針對靜態變數:繫結到一個特定物件的,不能被同一個類的不同物件共享,儲存在不相關的記憶體中)