3
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 调用方法:颜色为红色

BMW的调用方法:颜色为黑色

从 Car 调用方法:颜色为黑色

但是,我得到的结果是:

从 Car 调用方法:颜色为红色

BMW的调用方法:颜色为黑色

BMW的调用方法:颜色为黑色

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

好的!谢谢!

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

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

4

5 回答 5

14

铸造对象不会改变对象的性质。它仍然是宝马的对象;强制转换只是告诉编译器将其视为 Car 对象。

只要我们在继承的主题上:不需要将颜色变量或 get/setColor 方法放入超类和子类中。将它们放在汽车类中意味着它们可以在任何子类中使用;它们是多余的,在子类中有点混乱。我会把它们完全拿出来。

于 2013-01-04T04:25:56.453 回答
1

这是因为运行时多态性。最后一个陈述是因为即使你有一个指向 BMW 对象的汽车引用(通过强制转换你并没有​​修改对象的性质!BMW 仍然是 BMW 它不会成为 Car 对象!),最终它是 BMW 的 thisIs () 方法将被调用!这被称为动态方法调度

于 2013-01-04T04:22:47.600 回答
1

即使您称其为汽车,BMW 仍然是BMW。

演员表不会改变对象是什么。它只是告诉编译器您打算如何处理它。你创建了一辆宝马,当你调用它的thisIs方法时它仍然是一辆。

于 2013-01-04T04:25:26.387 回答
0

explicitly cast好吧,您不需要BMW objectto a Car 类型,因为 aBMW object是 a subclass 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()方法或任何其他属性。

于 2013-01-04T05:07:18.843 回答
-1

考虑以下代码:

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

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

于 2013-01-04T04:25:49.857 回答