为什么我们不能以常规方式在外部类的main方法中创建内部类的实例?

时间:2016-09-05 09:58:55

标签: java inner-classes outer-classes

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

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 个答案:

答案 0 :(得分:3)

class Demo{

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

    }

    static class innerclass{
            static int a=1;

    }


}

给出输出1。

在将内部类设置为静态时看到这里您可以在外部类中轻松访问,为了创建Nested类的实例,您必须通过在前面添加Outer类名称来引用它,如下所示:

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

非静态嵌套类(内部类) 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);
        }
    }
}

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您必须使内部类静态(如前所述)或从非静态上下文创建内部类,例如来自非静态方法。

即。要么:

int solutions_count = 0;
int n = 0;
const m = 10;
solution = []
while(solutions_count < m) {
  if(fulfills_f(n)) {
    solution += [n, f(n)]
    solutions_count++;
  }
  n++;
}

或者

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

答案 3 :(得分:0)

封装outerclass

innerclass未实例化,因此,直接调用innerclass会抛出错误,因为没有outerclass附加innerclass。< / p>

因此,如前面的答案所示,使innerclass静态可以解决问题,允许在没有实例化的情况下访问innerclass

关于这个主题,有很多现有的答案。一个快速谷歌提出了这一点。

said