1. 程式人生 > >Java 報錯No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing

Java 報錯No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing

解決方案:在Person內部類前面新增static,將內部類宣告為靜態內部類。

原因如下:在Java中 (1)類的靜態方法不能直接呼叫動態方法。 (2)類的靜態方法不能初始化內部類(包括該類的內部類,和其他檔案中的內部類)。 (3)類的靜態方法可以初始化其他類檔案中的類。 (4)類的靜態方法可以初始化靜態類(包括靜態內部類)。 真正的原因是:物件的生命週期。 (1)靜態變數和靜態方法的生命週期 靜態變數和靜態方法,在程序建立的時候就被建立了,而不是在物件建立的時候才被建立,並且其生命週期同該程序的生命週期一樣長,其佔用的系統資源是初始化程序申請資源的一部分。 (2)內部類的生命週期 如果是非靜態的內部類,必須由一個已建立的例項去建立一個對應的內部類例項,才能開始其生命週期,但如果是靜態的內部類,則可以直接建立。因為所有的靜態物件,都線上程建立的時候就一起被建立了。

瞭解了這些以後,上面的問題自然就可以解釋的通了。 (1)靜態方法線上程初始化的時候就被建立了,而這時候普通類都還沒來的及初始化,因此不能呼叫它的內部類。 (2)而如果是靜態類,記住一個原則——變數優先於方法被建立。因此靜態方法自然就可以呼叫靜態物件了。 (3)之所以可以在靜態方法中呼叫普通類是因為我們可以手動初始化該普通類。