2015-11-26 36 views
1

爲了理解向下轉換,我做了下面的代碼。在Java中再次向下執行父級構造函數?

class Vehicle{ 
    protected int tyres=0; 
    protected String name="default"; 
    Vehicle(){ 

    } 
    Vehicle(String aname){ 
     name=aname; 
    } 
    //abstract void setTyres(int number); 
    public void print(){ 
     System.out.println(name+":"+tyres); 
    } 
} 

class TwoWheeler extends Vehicle{ 
    TwoWheeler(){ 
     tyres=2; 
    } 
    public void print(){ 
     System.out.println(name+":"+tyres); 
    } 

} 

class FourWheeler extends Vehicle{ 
    FourWheeler(){ 
     tyres=4; 
    } 
    public void print(){ 
     System.out.println(name+":"+tyres); 
    } 

} 

public class vehicles { 
    public static void main(String[] args) { 
     try{ 
     Vehicle v= new Vehicle("Dummy"); 
     v.print(); 
     v= new TwoWheeler(); 
     v.print(); 
     } 
     catch(Exception e){ 
      System.out.println(e.toString()); 
     } 
    } 
} 

現在輸出 虛擬:0 默認:2

,而我預計虛擬:0假:2 看起來像父類的構造被稱爲第二次?請解釋這裏發生了什麼。 另外,如何在沒有調用父項的情況下執行向下轉換?

回答

0

父構造函數被第二次調用,因爲您正在創建兩個對象。

Vehicle v = new Vehicle("Dummy"); // first object created here 
    v.print(); 
    v = new TwoWheeler(); // second object created here 

您不能將基類實例的類型(例如您創建的第一個對象)更改爲子類實例。

您可以做的是定義一個TwoWheeler構造函數,該構造函數接受Vehicle參數並使用傳遞的Vehicle的屬性初始化新實例。這被稱爲拷貝構造函數。

TwoWheeler(Vehicle source) { 
    super (source.getName()); 
    tyres=2; 
} 

而且你main看起來就像這樣:

Vehicle v = new Vehicle("Dummy"); 
    v.print(); 
    v = new TwoWheeler(v); 
    v.print(); 
+0

謝謝。瞭解。 :) – Sum

0
Vehicle v = new Vehicle("Dummy"); 
//First object create with following properties, 
name = "Dummy" 
tyres = 0 

v = new TwoWheeler(); 
//Second object created with following properties, 

/* Flow goes like, 
    TwoWheeler() constructor called, 
    flow again go up to super and assign name with "default", 
    while flow come back to TwoWheeler() constructor , 
    tyres = 2 assign. 
*/ 

最後,輸出來按你顯示出來。 和