2014-07-17 99 views
0

如何將超類構造函數的某些參數繼承到子類構造函數? 例如,我只想將體重和身高繼承到子類,如何構造子類的約束函數?如何從超類繼承構造函數的部分到java中的子類

public abstract class People { 

    protected double weight; 

    protected int height; 

    protected String mood; 

    public People(double weight, int height, String mood) { 

     this.weight = weight; 
     this.mood = mood; 
} 

public class Health extends People { 

    private String bloodType; 

    public Health(double weight, int height, String bloodType){ 
     super(weight,height); // this won't work 
     this.bloodType = bloodType; 
} 
+3

'public Question' for a class called'People'?這甚至編譯? –

+1

儘管沒有推薦,但您可以在「健康」類構造函數中爲此設置'super(weight,height,「」);',只是爲參數提供一個空的String值。否則更好的方法是在超/具體類中使用參數'(double weight,int height)'提供一個更多的構造函數 –

回答

1

要麼你需要在超類(可能爲常數)情緒向構造函數,或者你需要一個構造函數添加到不採取心情超。你需要問自己是否每Question/People真的需要一個心情,以及一個DivisionQuestion/Health是什麼心情。 (它不會幫助你的代碼是目前它使用的類名的條款不一致。)

就像調用普通的方法,你不能一些參數而不是其他人提供的參數。

0

你只需要重載構造函數,或者可以在超類中爲變量「心情」設置默認值。但Effective Java建議使用靜態工廠方法,而不是重載構造函數。

0

只是爲了補充Jon Skeets和Harshil Sukhadias的答案。您可能需要兩個構造函數,一個只接受heightweight,併爲mood設置默認值,或者使用默認值調用第一個構造函數。

public abstract class People { 
    // ... 
    public static final String MOOD_DEFAULT = "Happy"; 
    public People(double weight, int height, String mood) { 
     // ... 
    } 
    // second ctor, calling the first with a default for mood... 
    public People(double weight, int height) { 
     this(weight,height,Question.MOOD_DEFAULT); 
    } 
} 

public class Health extends People{ 
    // ... 
    public Health(double weight, int height, String bloodType) { 
     super(weight,height); 
     // ... or super(weight,height,Question.MOOD_DEFAULT); 
    } 
} 

有這種類型的類層次的可能是實現生成器模式是有用的,看看更多細節Josuah Blochs的第2章,第2項「有效的Java」。