2013-10-11 52 views
9

我想創建一個將字段作爲參數的構造函數,然後將其放入存儲在超類中的字段中。下面是我使用從Java中的子類構造函數調用超類

public crisps(String flavour, int quantity) { 
    this.flavour = super.getFlavour(); 
    this.quantity = quantity; 
} 

在超我已經初始化現場與

private String flavour; 

的代碼,我有一個訪問方法

public String getFlavour() { 
    return flavour; 
} 

我得到一個錯誤「味道在超類私人訪問「,但我相信這應該不重要,因爲我調用訪問器方法,它返回到字段?

+0

恩,你有什麼應該可以正常工作。你確定你向我們展示真實的代碼嗎? –

+1

請發佈[SSCCE](http://sscce.org)以複製您的問題。 –

+0

在'薯片'中還是在父類中聲明'title'? –

回答

15

你應該做的:

添加一個構造函數,以您的超類:

public Superclass { 
    public SuperClass(String flavour) { 
     // super class constructor 
     this.flavour = flavour; 
    } 
} 

在薯片類:

public Crisps(String flavour, int quantity) { 
    super(flavour); // send flavour to the super class constructor 
    this.quantity = quantity; 
} 

 

有限公司mments

一些評論你的問題:

「在超我已經初始化現場與」

private String flavour; 

這不是一個初始化,這是一個宣言。初始化是當你設置一個值。

「我得到一個錯誤」味道在超類中有私人訪問「,但我相信這應該無關緊要,因爲我調用訪問器方法將它返回給字段?

當您調用訪問器(又名getter)時,它可以 - 取決於getter的可見性。 在你的代碼的問題是:

this.flavour = 

,因爲味道是不是薯片類聲明的字段,但在晚飯類,所以你不能做這樣的直接訪問。你應該用我的建議還是在超類聲明一個二傳手:

public void setFlavour(String flavour) { 
    this.flavour = flavour; 
} 

然後你可以使用它的子類:

public Crisps(String flavour, int quantity) { 
    this.quantity = quantity; 
    setFlavour(flavour); 
} 
+0

@ ipinto.eu雖然你的答案是正確的,你的解決方案也是如此,但你的答案中的最後一個替代解決方案(使用超類的setter)違反了繼承規則,我想,它會給出「[Overridable method call in constructor ](https://stackoverflow.com/questions/3404301/whats-wrong-with-overridable-method-calls-in-constructors)「的問題。因此,你最後的替代解決方案不是一個真正的解決方案,但會在代碼中帶來錯誤。我認爲,* super.setFlavour(flavor)*應該起作用。 –

+0

我理解並同意;我必須說,這個例子是爲了討論。我喜歡你用超級調用它的建議,其他選項(和不同的理念)是讓你的制定者最終(不可能覆蓋)。 –

1

flavour是私密的。雖然你從公開方法閱讀它,但是你將它分配給一個私人領域,並且你可能沒有在這個類中聲明它。

您可以設置味道protected父類或定義setter它

最終你的代碼並沒有真正意義雖然。即使它編譯了,也會更多或更少:flavour = flavour。也許你應該重新考慮你正在試圖做的一點點

我想你可能需要Java的更嚴格的把握和麪向對象編程的東西。

http://docs.oracle.com/javase/tutorial/java/concepts/

你應該從這裏開始。

+0

好吧,是否有通過調用公共方法getFlavour來做到這一點? – user215732

+0

@ user215732'getFlavour'就是這麼做的。它得到'flavour'。你不能用它來爲味道賦值。如果它返回一個可變對象,那麼你可以修改實際的風格,但在這種情況下,字符串是不可變的。 – Cruncher

+1

@ user215732你的'crisps'構造函數有一個參數'flavour',但是你沒有做任何事情,因爲你的代碼正在編寫。 – ajb

1
public crisps(String flavour, int quantity) 
{ 
    super(flavour); 
    this.quantity = quantity; 
} 

這應該爲see Docs

1

品牌

private String flavour; 

public,否則你的子類將無法訪問此String。 你的超類不知道任何子類的存在。根據Java文檔,「private」使得該類中的任何變量和方法都可用,其中聲明瞭私有變量或方法,但沒有任何類可以訪問它,甚至是子類。 一旦您有機會使用您的訪問修飾符,您將不會收到任何錯誤。

相關問題