2012-09-25 63 views
0

我正在學習java中與繼承有關的一章,我有幾個問題。超類構造函數的哪些參數?

我基本瞭解繼承是如何工作的(重寫方法,信息隱藏,如何在子類中使用超類中的私有字段等),但我只有一個問題,我希望你能幫助我。

當超有非默認的構造函數(S) - 不帶參數,這意味着在子類中我要創建新的構造(也可以是默認的 - 不帶參數),但在第一個語句必須是超類的構造函數調用

好吧,到目前爲止這麼好。我理解到目前爲止。在子類中,你必須調用超類的構造函數,匹配任何構造函數參數。

但是讓我們檢查下面的代碼:(超類)

public class Vehicle { 

    private int numOfWheels; 
    private double avgGallonsPerMile; 

    public Vehicle(int numOfWheels, double avgGallonsPerMile) { 

     this.numOfWheels = numOfWheels; 
     this.avgGallonsPerMile = avgGallonsPerMile; 
    } 
} 

而另一子類代碼:

public class Car extends Vehicle{ 

    public Car(double avgGallonsPerMile) { 
     super(What should i write here?, avgGallonsPerMile); 

     //force numOfWheels to 4; 

    } 
} 

這裏是練習子類:

每個子類 包含一個構造函數接受每加侖里程數作爲參數,並且強制車輪的數量達到適當的值2所述的機動兩輪車和4 汽車。

在子類構造函數中,我不需要numOfWheels字段,因爲無論如何,我會強制它爲4(用於汽車)和2(用於摩托車)。

但是,我仍然需要超類的數據。從哪裏獲得這些數據?調用超類的構造函數時應該作爲第一個參數。

但這仍然不是孤獨的情況。我有很多練習,我不需要在子類構造函數中的某些數據作爲參數,但仍然需要它們在超類構造函數調用中。

在這種情況下我該怎麼辦?

我真的很希望你能理解我,我想說的是什麼。這有點困難。

+0

「我不需要子類中的某些數據」a)克服它或b)從超類中刪除該字段。 –

+0

呃...你在評論中說你會強制輪子數量爲4,你會如何做到這一點?提示:numWheels字段是私人的,因此只能在Vehicle類中進行訪問和修改/設置。換句話說,您需要從Car構造函數中將numWheels的適當值發送給超類構造函數... – Alderath

回答

2

如果它反正相同的4個汽車和2摩托車不是讓如果修復!

super(4, avgGallonsPerMile); 

或者更好的辦法 - 聲明常數:

private static final int NUM_OF_WHEELS = 4; 
.. 
super(Car.NUM_OF_WHEELS, avgGallonsPerMile); 
1

很簡單:如果車輪在Car的數量始終是4,他們只需通過值4:

public Car(double avgGallonsPerMile) { 
    super(4, avgGallonsPerMile); 

    // ... 
} 
2

如果你不需要一個超類中的字段,然後沒準它不應該存在。相反,您可以執行以下操作。

public abstract class Vehicle { 
    private final double avgGallonsPerMile; 

    public Vehicle(double avgGallonsPerMile) { 
     this.avgGallonsPerMile = avgGallonsPerMile; 
    } 
    public double getAvgGallonsPerMile() { return avgGallonsPerMile; } 
    public abstract int getNumOfWheels(); 
} 

public class Car extends Vehicle{ 
    public Car(double avgGallonsPerMile) { 
     super(avgGallonsPerMile); 
    } 
    public int getNumOfWheels() { return 4; } 
} 

public class Bicycle extends Vehicle{ 
    public Bicycle (double avgGallonsPerMile) { 
     super(avgGallonsPerMile); 
    } 
    public int getNumOfWheels() { return 2; } 
} 

public class Tricycle extends Vehicle{ 
    public Tricycle (double avgGallonsPerMile) { 
     super(avgGallonsPerMile); 
    } 
    public int getNumOfWheels() { return 3; } 
} 

順便說一句:如果汽車每加侖燃料使用的加侖數量一定很低,

+0

+1用於解釋如果在超類中不需要,它不應該在那裏。 – Jesper

+0

avgGallonsPerMile可能是分數:) –

+0

將字段作爲超類的一部分並將其值作爲參數傳遞給子類構造函數的超類構造函數會出現什麼問題? (就像創建家庭作業問題的人明顯打算的那樣) – Alderath