2014-01-28 37 views
7

當實例化嵌套類時,它如何引用外部類?它是否總是擴展外部類或以另一種方式引用它?我被告知內層擴展了外層,但爲什麼下面的例子不起作用?在Java中,嵌套類和它的外部類之間有什麼關係?

例如:

public class OuterClass { 

    public String fruit = "apple"; 

    public class InnerClass { 
     public String fruit = "banana"; 

     public void printFruitName(){ 
      System.out.println(this.fruit); 
      System.out.println(super.fruit); 
     } 
    } 

} 

上面不與用於super.fruit一個錯誤說,「水果」無法解析編譯。但是如果指定了內部類擴展外部類,那麼它的工作原理:

public class OuterClass { 

    public String fruit = "apple"; 

    public class InnerClass extends OuterClass { 
     public String fruit = "banana"; 

     public void printFruitName(){ 
      System.out.println(this.fruit); 
      System.out.println(super.fruit); 
     } 
    } 

} 

這似乎表明,除非特別指定的內部類不會擴展外部類。

回答

8

還有隱式子型關係:您的觀察/結論是正確的。 (在第一種情況下,super具有「對象」類型並且「Object.fruit」確實不存在)。

如圖所示,inner class(與「靜態嵌套類」相對)必須在外部類實例的上下文;但這與子分型是正交的。

要訪問外部類中的一員,使用OuterClass.this.member或者,如果member沒有陰影,只是member將解決; 既不是super.member也不是this.member將解析爲外部類成員。

擴展外部類「修復」的編譯器錯誤,但代碼與this.fruit訪問封閉在OuterClass實例的部件 - 它只是訪問來自超類繼承的的實例將InnerClass的構件它延伸。

+0

請問你能澄清你最後一句話嗎?我不知道'OuterClass.this',並且在這裏的問題中發佈的代碼中使用它,但是當我有內部類擴展外部類時,那麼'OuterClass.this.fruit'和'super.fruit '給我外部實例的'水果'價值。 –

+0

@MikeB這個*看起來就是這種情況,即使它不是,因爲當創建一個新的OuterClass實例時,成員被設置(相同的值) - 例如,對於* real * OuterClass實例和InnerClass實例的超類。 OuterClass實例的'fruit'成員變量在初始化之後,但在創建內部類實例之前更改 - 然後您將看到不同之處。 – user2864740

+0

你說得對,我甚至在我的原始代碼中這樣做了,但是我看到了梨,並忽略了第二組輸出應該有2個梨的事實! –

相關問題