創建Java內部類的編譯錯誤處理

轉自:http://www.cdtarena.com/javapx/201305/8712.html

  在創建非靜態內部類時,經常會遇到“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”這個編譯報錯了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章