有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

嵌套类中的Java对象实例化这有什么问题:

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

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

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


共 (3) 个答案

  1. # 1 楼答案

    在这种情况下,你不是从子类而是从内部类

    因此,在本例中,要创建内部类的实例,需要外部类的实例,因此可以执行以下操作:

    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";
            }
        }
    }
    
  2. # 2 楼答案

    创建内部类对象的语法如下

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

    NOT这个

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

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

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

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

    Read Java Docs for more details

  3. # 3 楼答案

    new [enclosing class].[enclosed class](...)习惯用法用于初始化静态嵌套类,即声明为其封闭类的static成员的嵌套类

    {}习惯用法用于初始化内部类,即声明为其封闭类的实例成员的嵌套类

    示例

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

    您将使用:

    • new A.B()
    • new A().new C(),或者使用名为aA的给定实例
    • a.new C()

    注意