📜  无法访问 Foo 类型的封闭实例.必须使用 Foo 类型的封闭实例限定分配(例如 xnew A() 其中 x 是 Foo 的实例 - Java (1)

📅  最后修改于: 2023-12-03 14:55:07.840000             🧑  作者: Mango

无法访问 Foo 类型的封闭实例.必须使用 Foo 类型的封闭实例限定分配(例如 xnew A() 其中 x 是 Foo 的实例 - Java

这个错误信息通常在使用嵌套类(Nested Class)时出现。当要实例化内部类时必须具有指向其外部类的引用。这个引用可以是明确地传递给内部类的构造函数,也可以通过子类的方式访问,但必须要有。

例如:

class Foo {
    private int x;
    class Bar {
        void baz() {
            x = 10; // 它可以访问 Foo 类型的封闭实例 x
        }
    }
}

Foo foo = new Foo();
Foo.Bar bar = foo.new Bar(); // 注意这里是 foo.new Bar(),而不是只是 new Bar()

在上述例子中,我们创建了一个名为 Foo 的类,在类中嵌套了一个名为 Bar 的内部类。要实例化 Bar,我们需要先创建一个 Foo 的对象,然后使用 foo.new Bar() 的方式实例化一个 Bar 的实例。

如果我们这样写:

Foo.Bar bar = new Foo.Bar(); // 错误!无法访问 Foo 类型的封闭实例

就会出现上面的错误信息。因为我们没有明确地指定这个 Bar 对象所属的 Foo 对象,无法访问 Bar 类中使用的 Foo 对象。

如果要在静态方法中使用内部类,可以考虑将内部类声明为静态嵌套类(Static Nested Class),这样就不需要创建外部类的实例了。

例如:

class Foo {
    private static int x;
    static class Bar {
        void baz() {
            x = 10; // 它可以访问 Foo 类型的静态变量 x
        }
    }
}

Foo.Bar bar = new Foo.Bar();

这是因为静态嵌套类不需要创建外部类的对象,它们可以自由地创建自己的对象。从而不会出现 无法访问 Foo 类型的封闭实例 的错误。

希望这篇介绍可以帮助你更好地了解 Java 的内部类和嵌套类。