为什么我们不能在外部类的主方法中创建内部类的实例?



我知道如何创建一个内部类的实例。但我想知道为什么我们不能这样做:

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

为什么?

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();

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

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

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

你必须让你的内部类是静态的(如上所述),或者从一个非静态的上下文中创建你的内部类,例如从一个非静态的方法。

。要么:

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{
      }
}

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

因此,正如前面的答案所建议的那样,将innerclass设置为静态将解决这个问题,允许在不实例化的情况下访问innerclass

关于这个话题有很多现有的答案。谷歌一下就能看到

相关内容

  • 没有找到相关文章

最新更新