2014-11-04 48 views
0

我讀過關於class fromal parameters的問題,然後問題出現,爲什麼下面的代碼是不合格的?Java中的內部類構造

A

package org.gradle; 

public class A extends B.Inner{ 

    public A(B s){ 
     s.super(new B()); //error 
     s.super();  //OK 
    } 
} 

B

package org.gradle; 

public class B{ 

    public class Inner{ 
    } 
} 

什麼說的關鍵部分是:

非私有內部成員類的構造函數隱 聲明,作爲第一個形式參數,一個變量代表 立即封閉類

這樣的情況下,我希望,除了默認的構造函數,我們應該有一個具有以下簽名的構造函數:

Inner(B b); 

爲什麼不呢?

回答

1

「額外」參數對您來說是有效隱藏的 - 無論是在聲明時還是在執行時。當你執行它,你提供以不同的方式的值 - 在你的情況下,通過s

s.super(); 

這是通過s作爲隱藏的額外參數的構造函數B.Inner。所有這些的語法都有點奇怪 - 我個人會盡量避免在這種情況下使用內部類......他們只是很快就會變得怪異。我通常更喜歡靜態嵌套類,如果我需要一個內部類,它幾乎總是私有的。在不同的頂級類中聲明的內部類的子類是一個奇怪的情況,IMO。

+0

謝謝,但它不是很清楚爲什麼我不能明確地調用該構造函數,如http://ideone.com/igXgCM? May JLS提供了我失去的限制嗎? – 2014-11-04 07:21:43

+1

@ St.Antario:這不是內部類的工作方式 - 你會使用'new B()。new Inner()'來代替。你不打算把它看作是一個額外的參數 - 你打算把它看作是用來構造內部類實例的封閉類的實例。 – 2014-11-04 07:22:59

+0

JLS是否明確指出? – 2014-11-04 07:26:51

1

您已經經過外圍實例sB類的),當你調用s.super()內部類的構造函數,所以沒有必要通過的B另一個實例。

variable representing the immediately enclosing instance of the class是一個隱式參數,它使用特殊的語法傳遞給構造函數。