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()中添加一个方法来获得我想要的结果。
答案 0 :(得分:14)
投射对象不会改变对象的性质。它仍然是宝马的对象; cast只是告诉编译器将其视为Car对象。
只要我们处于继承的主题:没有必要将color变量或get / setColor方法放入super和subclass中。将它们放入汽车类意味着它们可用于任何子类;它们是多余的,在子类中有点令人困惑。我会完全把它们拿走。
答案 1 :(得分:1)
这是因为运行时多态性。最后一个声明是因为即使你有一个汽车参考指向宝马对象(通过铸造你没有改变物体的性质!宝马仍将是宝马它不会成为汽车的对象!),最终它的宝马这是()方法将被调用!这被称为Dynamic Method Dispatch
答案 2 :(得分:1)
即使你称之为汽车,宝马仍然是宝马。
演员阵容不会改变对象的内容。它只是告诉编译器你打算如何对待它。你创建了一辆宝马,当你调用它的thisIs
方法时它仍然是一个。
答案 3 :(得分:0)
那么您不需要explicitly cast
BMW object
到汽车类型,因为BMW object
是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()
方法或任何其他属性。
答案 4 :(得分:-1)
请考虑以下代码:
public void someMethod(Car c) {
c.thisIs();
}
' C'可以保存所有子类的引用。无论哪个引用都被' c'保留,将调用该方法。它也称为运行时多态性。