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

时间:2017-08-17 13:21:26

标签: java object instantiation inner-classes

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

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 个答案:

答案 0 :(得分:2)

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

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

<强>实施例

使用...

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

您将使用:

  • new A.B()
  • new A().new C(),或者名为A的{​​{1}}的给定实例,
  • a

注意

答案 1 :(得分:0)

创建Inner类对象的语法是

NOT

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

InnerClass

因为OuterClass的实例只能存在于InnerClass innerObj = new OuterClass().new InnerClass(); 的实例中。

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

SET @r=0;UPDATE users SET rank = @r:= (@r+1) ORDER BY score DESC

Read Java Docs for more details

答案 2 :(得分:0)

在这种情况下,你不要从子类而不是内部类来谈...... .... / / p>

所以,在这种情况下,要创建一个内部类的实例,你需要一个外部类的实例,所以你可以这样做:

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";
        }
    }
}