关于在JAVA中将子类强制转换为超类

use*_*415 3 java

public class Car {

    String color;

    public void thisIs(){
        System.out.println("Calling method from Car: the color is " + color);
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}

public class BMW extends Car {

    public void thisIs(){
        System.out.println("Calling method from BMW: the color is " + color);
    }
    public Car toCar(){
    Car newCar = new Car();
    newCar.setColor(this.color);
    return newCar;
}

}

public class AbstractTest {

    public static void main(String args[]){
        Car aCar = new Car();
        aCar.setColor("Red");
        aCar.thisIs();

        BMW aBMW = new BMW();
        aBMW.setColor("Black");
        aBMW.thisIs();

        //Car aaCar = new Car();
        //aaCar = (Car)aBMW;
        //aaCar.thisIs();

            Car aaCar = aBMW.toCar();
    aaCar.thisIs();
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望结果如下:

来自Car的调用方法:颜色为红色

来自宝马的呼叫方法:颜色为黑色

来自Car的调用方法:颜色为黑色

但是,我得到的结果是:

来自Car的调用方法:颜色为红色

来自宝马的呼叫方法:颜色为黑色

来自宝马的呼叫方法:颜色为黑色

我哪里错了?我如何使用超类中的方法来获取子类对象中的数据?我可以toCar()在宝马课上写一个方法来做到这一点.但是,为什么铸造不起作用?谢谢!

好!谢谢!

我知道为什么铸造不起作用.

所以,我在BMW toCar()中添加了一个方法来获得我想要的结果.

arc*_*rcy 14

投射对象不会改变对象的性质.它仍然是宝马的对象; cast只是告诉编译器将它视为Car对象.

只要我们处于继承的主题:没有必要将color变量或get/setColor方法放入super和subclass中.将它们放入汽车类意味着它们可用于任何子类; 它们是多余的,在子类中有点令人困惑.我会完全把它们拿走.

  • 超级而不是这个 (2认同)