2017-08-17 123 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"; 
     } 
    } 
}