Java中的内部类必须是静态的吗?

时间:2010-05-20 13:22:06

标签: java static

我创建了一个非静态的内部类:

class Sample {
    public void sam() {
        System.out.println("hi");
    }    
}

我用这样的main方法调用它:

Sample obj = new Sample();
obj.sam();

它给出了一个编译错误:non-static cannot be referenced from a static context当我将非静态内部类声明为静态时,它可以工作。为什么会这样?

4 个答案:

答案 0 :(得分:10)

对于非静态内部类,编译器会自动向“owner”对象实例添加隐藏引用。当您尝试从静态方法(例如,main方法)创建它时,没有拥有实例。这就像尝试从静态方法调用实例方法 - 编译器不允许它,因为您实际上没有要调用的实例。

因此内部类本身必须是静态的(在这种情况下不需要拥有实例),或者只在非静态上下文中创建内部类实例。

答案 1 :(得分:4)

非静态内部类将外部类作为实例变量,这意味着它只能从外部类的这样一个实例中实例化:

public class Outer{
    public class Inner{
    }

    public void doValidStuff(){
         Inner inner = new Inner();
         // no problem, I created it from the context of *this*
    }

    public static void doInvalidStuff(){
         Inner inner = new Inner();
         // this will fail, as there is no *this* in a static context
    }

}

答案 2 :(得分:2)

内部类需要外部类的实例,因为编译器生成了隐式构造函数。但是你可以像下面这样解决它:

public class A {

  public static void main(String[] args) {
    new A(). new B().a();
  }

  class B {
    public void a() {
      System.err.println("AAA");
    }
  }

}

答案 3 :(得分:1)

也许这会有所帮助:http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html 无法在静态上下文中调用非静态内部类(在您的示例中,没有外部类的实例)。