2017-02-17 65 views
1

當前正在學習Java,我有一個關於從抽象類中創建子類的問題。我有這個:從Java中的抽象類創建子類

public abstract class Bike 
{ 
    private int cost; 

    public Bike(){} 

    public abstract void displayCost(); 
} 


public class SportsBike extends Bike 
{ 
    private int topSpeed(); 

    ??? 
} 

public class CasualBike extends Bike 
    { 
     private int brakeSpeed(); 

     ??? 
    } 


public void main() 
{ 
    SportsBike b1 = new SportsBike(???); 
    CasualBike b2 = new CasualBike(???); 
} 

我怎麼會有這兩個sportsBike和casualBike的構造函數,使他們有自己的信息?我讀過關於@super等的東西,但我不知道如何實現它。如果我有多個類繼承一個類,@override會工作嗎?

+0

是對於類SportBike和CasualBike常見的構造函數參數嗎? –

+1

只需將您想要的構造函數添加到「SportsBike」和「CasualBike」中,並設置您想要的任何內容。要知道,即使你不在子類構造函數中調用超類構造函數,它也會被調用,但它會在子類構造函數之前執行,所以你可以隨意初始化你的成員變量。 –

回答

1

這是一個簡單的例子,你可以玩,看看構造函數是如何工作的,以及類的構造函數是如何超自動即使你不叫不明確地稱它們爲:

public class Parent { 
    protected int parentVariable; 
    public Parent(){ 
     parentVariable=1; 
     System.out.println("parent no-argument constructor"); 
    } 
    public Parent(int value) { 
     System.out.println("parent int constructor"); 
     parentVariable = value; 
    } 
    public int getParentVariable() { 
     return parentVariable; 
    } 
} 

public class Child extends Parent { 
    private int childVariable; 

    public Child() { 
     // Call super() is automatically inserted by compiler 
     System.out.println("child no-argument constructor"); 
     childVariable = 99; 
    } 
    public Child(int value, int childValue){ 
     // Explicit call to parent constructor 
     super(value); 
     System.out.println("child int constructor"); 
     childVariable = childValue; 
    } 
    public int getChildVariable() { 
     return childVariable; 
    } 
} 

public class Driver { 

    public static void main(String[] args) 
    { 
     Child c1 = new Child(); 
     Child c2 = new Child(3,199); 

     System.out.println(c1.getParentVariable()); 
     System.out.println(c2.getParentVariable()); 

     System.out.println(c1.getChildVariable()); 
     System.out.println(c2.getChildVariable()); 
    } 

} 
+0

如果子或子類有自己的變量進行初始化,它會如何工作? –

+0

您只需使用子/子類構造函數初始化變量,就像使用不擴展任何其他類的類一樣(顯然,除了隱式擴展'Obect')之外。我編輯了答案來展示一個簡單的例子。 –

+0

謝謝你的例子! –

1

我假設cost對於CasualBikeSportsBike都是通用的。

使用super關鍵字來調用這兩個類並形成它們的對象。

public class SportsBike extends Bike 
{ 
    SportsBike(int cost){ 
     super(cost); 
    } 

} 

和你的抽象類應該是這樣的:

public abstract class Bike 
{ 
    private int cost; 

    public Bike(cost){ 
this.cost=cost; 
} 
} 
+0

那麼,這個工作是否會在SportsBike中初始化topSpeed? SportsBike(int cost,int speed) { super(cost); topSpeed =速度; } –