在創建非靜態內部類時,經常會遇到“No enclosing instance of type * is accessible. Must qualify the allocation with an enclosing instance of type *(e.g. x.new A() where x is an instance of *).”這樣的報錯,其實原因只有一點,內部類是依賴於外部類存在的,所以在使用非靜態內部類時,要求先實例化外部類才可以使用內部類。關於非靜態內部類,我們可以把它理解成外部類的成員變量,我們在使用一個類的非靜態成員變量時要求先對類進行實例化,然後通過對象來調用這個類的非靜態成員變量。這裡非靜態內部類同外部類的關系,就如同非靜態成員變量同類的關系一樣。所以在使用非靜態內部類時,要求先實例化外部類。
下面我給出例子來分析一下:
package com.csc.innerclasstest;
/**
*
* @author csc
*
*/
//外部類
public class OuterClass {
/**
* @param args
*/
public static void main(String[] args) {
InnerClass innerClass = new InnerClass();
innerClass.say();
System.out.println("I am in OuterClass!");
}
//定義一個內部類
private class InnerClass{
private void say() {
System.out.println("I am in InnerClass!");
}
}
}
上面的代碼的第16行將會報出“No enclosing instance of type OuterClass is accessible. Must qualify the allocation with an enclosing instance of type OuterClass (e.g. x.new A() where x is an instance of OuterClass).”這樣的編譯錯誤。錯誤的原因如上面紅色字體所述。
解決方法一:將非靜態內部類轉換成靜態內部類,即在上面程序的第21行的“Private”後面加上“Static”即可。
解決方法二:先實例化外部類,然後通過外部類來調用內部類的構造函數,代碼如下:
package com.csc.innerclasstest;
/**
*
* @author csc
*
*/
//外部類
public class OuterClass {
/**
* @param args
*/
public static void main(String[] args) {
//實例化外部類
OuterClass outerClass = new OuterClass();
//通過外部類引用內部類
InnerClass innerClass = outerClass.new InnerClass();
innerClass.say();
System.out.println("I am in OuterClass!");
}
//定義一個內部類
private class InnerClass{
private void say() {
System.out.println("I am in InnerClass!");
}
}
}
上面代碼的第16行先進行了外部類的實例化,第18行通過外部類來引用內部類,這樣就不會出現“No enclosing instance of type OuterClass is accessible. Must qualify the allocation with an enclosing instance of type OuterClass (e.g. x.new A() where x is an instance of OuterClass”這個編譯報錯了。