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

时间:2013-01-04 04:18:04

标签: 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();
    }
}

我希望结果是:

  

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

     

宝马的召唤方法:颜色为黑色

     

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

但是,我得到的结果是:

  

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

     

宝马的召唤方法:颜色为黑色

     

宝马的召唤方法:颜色为黑色

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

OK!谢谢!

我知道为什么演员不起作用。

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

5 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:1)

这是因为运行时多态性。最后一个声明是因为即使你有一个汽车参考指向宝马对象(通过铸造你没有改变物体的性质!宝马仍将是宝马它不会成为汽车的对象!),最终它的宝马这是()方法将被调用!这被称为Dynamic Method Dispatch

答案 2 :(得分:1)

即使你称之为汽车,宝马仍然是宝马。

演员阵容不会改变对象的内容。它只是告诉编译器你打算如何对待它。你创建了一辆宝马,当你调用它的thisIs方法时它仍然是一个。

答案 3 :(得分:0)

那么您不需要explicitly cast BMW object到汽车类型,因为BMW objectsubclass of Car and a Car can be of any type(宝马或其他任何东西)。因此,当您通过编译器分配BMW object to a car the implicit casting is done时。在您的情况下,您是explicitly asking the compiler to cast the BMW object to car type

此隐式转换并不意味着BMW对象将失去其thisIs()方法或任何其他属性。

答案 4 :(得分:-1)

请考虑以下代码:

public void someMethod(Car c) {
  c.thisIs(); 
}

' C'可以保存所有子类的引用。无论哪个引用都被' c'保留,将调用该方法。它也称为运行时多态性。