我很想理解为什么以下实例化无法编译:
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();
但它无法解释我的方法有什么问题,或者为什么必须使用这种替代语法。
答案 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
答案 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";
}
}
}