了解 Java 中的内部 class

Understanding inner class in Java

考虑以下 class:

package test;

public class Container {
    public class Contained {
        public void foo() {
            System.out.println("printed");
        }
    }
}

和 Main.java:

package test;

public class Main {

    public static void main(String[] args){
        Container c = new Container();
    }
}

因此,我们在这里创建了 Container class 的实例。这是否意味着我们还创建了内部 class 的实例?我想,是的,因为内部 class 是一个 non-static 嵌套 class。但是我们如何才能访问到内部 class 的实例呢?我们可以在 Container class 之外创建实例吗?

如果您提供一些对 JLS 的参考,将会非常有用。

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

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

所以在你的情况下它将是

Container container = new Container();
Container.Contained containedClass = container.new Contained();

这叫做内Class。在内部 class 您可以访问容器 class 成员

要为静态嵌套 class 创建对象,请使用以下语法:

 OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

这称为静态嵌套 Class。在静态嵌套 Class 中,您无法访问容器 class 实例成员,只能访问静态成员

创建 Container 的实例不会创建 Contained class 的实例,因为可以有许多 Contained 的实例与同一个实例相关联Container 个。您显式创建 Contained 的实例。

是的,您可以在 Container class 之外创建一个实例,方法是指定将与之关联的 Container 的实例:

Container cr = new Container();
Container.Contained cd = cr.new Contained ();

内部 classes 在 JLS 8.1.3 中描述。