在java中将对象类更改为子类

时间:2016-05-29 10:59:09

标签: java class

我想将类Car的对象更改为类FastCar的对象。很容易看出main方法在这种情况下返回错误。我写它是为了更容易表达我的问题:如何围绕超类的对象构建子类的对象?考虑到类可能不小的最佳方法是什么?以下示例? 该解决方案也适用于具有大量字段的大型课程。

    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;
    }

更新
正如@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 个答案:

答案 0 :(得分:3)

有几种方法可以进行向下转换:

  1. FastCar(Car car)课程中添加构造函数FastCar
  2. public FastCar asFastCar()课程中介绍方法Car
  3. 在任何地方介绍util方法public static FastCar castToFastCar(Car car)

答案 1 :(得分:1)

当你写下这一行时:

car = fast;

java自动执行上层转换,因此您不必手动完成。

也许你想要做的是这样的事情:

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

现在要使用car2对象访问FastCar类的方法,你必须像这样:

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

通常,您不能使超类的对象被前一个案例中的子类的对象引用。

答案 2 :(得分:1)

我不能完全确定最佳方法,但是你能做到的一种方法是将Car对象作为FastCar类的参数,然后从那里添加所有变量。或者接受Car类在Fast Car构造函数中设置的变量。

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

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