2016-05-29 54 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