Java 来自嵌套 class 的对象实例化 - 这有什么问题:

Java object instantiation from nested class - What's wrong with this:

我很想了解为什么以下实例无法编译:

Superclass.Subclass myObject = new Superclass.Subclass();

错误信息如下:

No enclosing instance of type Superclass is accessible. Must qualify the allocation with an enclosing instance of type Superclass (e.g. x.new A() where x is an instance of Superclass).

封闭实例是什么意思?为什么这是必要的?

这条消息似乎在说明语法必须是:

Superclass mySuperObj = new Superclass();
Superclass.Subclass mySubObj = mySuperObj.new Subclass();

但它无法解释我的方法有什么问题或为什么必须使用这种替代语法。

new [enclosing class].[enclosed class](...)习惯用法用于初始化静态嵌套classes,即嵌套classes被声明为它们封闭[=]的static成员50=]。

[enclosing class instance].new [enclosed class](...)习惯用法用于初始化内部classes,即声明为实例的嵌套classes他们封闭的成员 class。

例子

与...

class A {
    static class B {}
    class C {}
}

您将使用:

  • new A.B()
  • new A().new C(),或给定的 A 实例称为 a
  • a.new C()

备注

创建内部 class 对象的语法是

 InnerClass innerObj = new OuterClass().new InnerClass(); 

NOT

Superclass.Subclass myObject = new Superclass.Subclass();

因为InnerClass 的实例只能存在于 OuterClass.

的实例中

要实例化内部 class,您必须首先实例化外部 class。然后,使用 语法在外部对象中创建内部对象:

InnerClass innerObj = new OuterClass().new InnerClass(); 

Read Java Docs for more details

在这种情况下,你不会从子 class 说话,而是从内部 class 说话....

所以,在这种情况下,要创建内部 class 的实例,您需要外部 class 的实例,因此您可以:

public class Foo {

    public static void main(String[] args) {
        Foo myFooObject = new Foo();
        Foo.InnerClass myFooInnerClass = myFooObject.new InnerClass();
        System.out.println(myFooObject);
        System.out.println(myFooInnerClass);
    }

    class InnerClass {
        @Override
        public String toString() {
            return "Am inner class";
        }
    }
}