2017-08-17 61 views
0

我很想知道为什么下面的实例将不能编译: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(); 

,但它无法解释什么是错我的方法为什么必须使用这种替代语法。

+0

哪里是代码,声明超类和子类?你应该发布[mcve] - 在你的情况下,你应该关注** Complete **的C。 –

回答

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给定的实例调用a
  • ​​

注意

+0

谢谢你。你的例子说明了每种情况都必须使用不同的习语。但为什么必须有两种不同的成语?为什么我们不能在这两种情况下使用第一个成语?我不清楚这一点。 – IqbalHamid

+0

@IqbalHamid不用客气。语法是一个任意的构造。尽管在这种情况下,它与其他成员区分静态成员和实例成员访问是一致的。反过来,你需要在Java中,因为这些是非常不同的上下文。 – Mena

0

的语法来创建一个内部类对象是

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

0

....

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

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