1

我知道如何制作内部类的实例。但我想知道为什么我们不能通过以下方式做到这一点:

class outerclass{

      public static void main(String[] args){
              innerclass in=new innerclass();
      }

      class innerclass{


      }

}

如果我这样做,那么我会收到以下错误:

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).

为什么?

4

4 回答 4

3
class Demo{

    public static void main(String[] args){
            System.out.println(innerclass.a);

    }

    static class innerclass{
            static int a=1;

    }


}

给出输出 1。

将内部类设置为静态时请参见此处 您可以在外部类中轻松访问,为了创建嵌套类的实例,您必须通过在外部类名称前面加上前缀来引用它,如下所示:

Outer.Nested instance = new Outer.Nested();

非静态嵌套类(Inner Classes) Java 中的非静态嵌套类也称为内部类。内部类与封闭类的一个实例相关联。因此,您必须首先创建封闭类的实例才能创建内部类的实例。这是一个示例内部类定义:

public class Outer {

  public class Inner {
  }

}

以下是如何创建 Inner 类的实例:

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();

请注意如何在外部类的引用之后放置 new 以创建内部类的实例。

非静态嵌套类(内部类)可以访问封闭类的字段,即使它们被声明为私有。这是一个例子:

public class Outer {

    private String text = "I am private!";

    public class Inner {

        public void printText() {
            System.out.println(text);
        }
    }
}
于 2016-09-05T10:33:26.140 回答
1

innerclass的不是静态的。这意味着它必须具有对外部类的引用。 main是静态的并且没有隐式的外部类。

简单的解决方案是使您的内部类成为静态嵌套类。

于 2016-09-05T10:14:19.970 回答
0

您必须将内部类设为静态(如前所述)或从非静态上下文(例如从非静态方法)创建内部类。

即:

class outerclass{
  void myMethod() {
      innerclass in = new innerclass();
  }
  class innerclass{
  }
}

或这个

class outerclass{
      public static void main(String[] args){
           innerclass in=new innerclass();
      }
      static class innerclass{
      }
}
于 2016-09-05T10:20:54.930 回答
0

outerclass那就是封装innerclass没有实例化,因此,innerclass直接调用会抛出错误,因为没有outerclass附加innerclass

因此,正如前面的答案所建议的那样,制作innerclassstatic 可以解决问题,允许在innerclass没有实例化的情况下访问。

关于这个主题有很多现有的答案。一个快速的谷歌带来了这个。

Java - 无法访问 Foo 类型的封闭实例

于 2016-09-05T10:34:06.300 回答