歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

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

Copyright © Linux教程網 All Rights Reserved