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