2016-05-29 44 views
1

我想將類Car的對象更改爲類FastCar的對象。在這種情況下很容易看到主方法返回一個錯誤。我寫它更容易表達我的問題:如何在超類的對象周圍構建子類的對象?考慮到下面的例子中的類可能不是很小,最好的方法是什麼? 該解決方案還應該適用於大類,並且有很多領域。在java中將對象類更改爲子類

public class Car { 
     String name; 
     String label; 
     Car(String name){ 
      this.name = name; 
      label = "Car"; 
     } 

     Car(){ 
      this("dafaultCarName"); 
     } 
    } 

    public class FastCar extends Car{ 
     String howFast; 
     FastCar(){ 
      howFast = "veryFast"; 
     } 
     FastCar(String name){ 
      super(name); 
      howFast = "veryFast"; 
     } 
    } 

    public static void main(String[] args) { 
      FastCar fast; 
      Car car = new Car("FastCarName"); 
      fast = (FastCar) car; 
    } 

UPDATE
作爲@Arthur說:

public class Car { 
    String name; 
    String label; 
    Car(String name){ 
     this.name = name; 
     label = "Car"; 
    } 

    Car(){ 
     this("dafaultCarName"); 
    } 
} 

public class FastCar extends Car{ 
    String howFast; 
    FastCar(){ 
     howFast = "veryFast"; 
    } 
    FastCar(String name){ 
     super(name); 
     howFast = "veryFast"; 
    } 

    FastCar(Car car){ 
     super(car.name); 
    } 
} 

public static void main(String[] args) { 
     FastCar fast; 
     Car car = new Car("FastCarName"); 
     car.label = "new Label"; 
     fast = new FastCar(car); 
     System.out.println(fast.label); 
    } 

通過@Arthur提出的從FastCar構造並不好,因爲不保留的標籤。
輸出是Car,但我預計它是new Label。 我想要一些技巧將我的「汽車」轉換爲「快速車」,而不會丟失數據。這個技巧也應該對大類更有效。

回答

3

有幾種方法可以做垂頭喪氣:

  1. 添加構造FastCar(Car car)FastCar類。
  2. 介紹方法public FastCar asFastCar()Car類。
  3. 任何地方都可以引入util方法public static FastCar castToFastCar(Car car)
+0

難道這些方式有利於大類呢? – webpersistence

+1

另外,我認爲這是沮喪。 – webpersistence

+0

是的,它是downcast –

1

當你寫一行:

car = fast; 

的Java自動執行uppercasting,這樣你就不用手工去做。

也許你想做的事是這樣的:

Car car = new Car(); 
FastCar fastCar = new FastCar(); 
FastCar fastCar2 = new Car();//you cant do this since Car is the Superclass of Fast car 
Car car2 = new FastCar();//this is right 

我們訪問FastCar類的方法和你不得不垂頭喪氣像這樣CAR2對象:

FastCar fastCar3 = (FastCar)car2;//now you can access the moethods of FastCar class with the car2 object. 

在一般而言,您不能使超類的對象被前一種情況下的子類對象引用。你可以做到這一點

+0

我認爲這是沮喪,不是嗎? – webpersistence

+0

對不起,我與名稱混淆。 – theVoid

+0

也許我沒有很好地表達這個問題。我沒有「快車」。我有一輛「汽車」,我想讓它成爲一輛「快車」。 – webpersistence

1

我不是要做到這一點的最好辦法完全確定,但一個方法是通過一個Car對象作爲FastCar類的參數,然後添加所有的變量從那裏。或者接受Car類在Fast Car構造函數中設置的變量。

// FastCar class 
FastCar(Car car){ 
    super(car.name); 
} 

FastCar(String name){ 
    super(name); 
} 
+0

這些構造函數只保留名稱字段。我想保留所有內容(包括標籤)。 – webpersistence

+0

'label = car.label;' – Arthur

+0

把那個超級(car.name) – Arthur