请在此处查看此代码。
class Vehicle {
public void printSound() {
System.out.print("vehicle");
}
}
class Car extends Vehicle {
public void printSound() {
System.out.print("car");
}
}
class Bike extends Vehicle{ // also tried to extend Car
public void printSound() {
System.out.print("bike");
}
}
public class Test {
public static void main(String[] args) {
Vehicle v = new Car();
Bike b = (Bike)v;
v.printSound();
b.printSound();
Object myObj = new String[]{"one", "two", "three"};
for (String s : (String[])myObj) System.out.print(s + ".");
}
}
执行此代码将给出ClassCastException
说inheritance.Car cannot be cast to inheritance.Bike
。
现在看线Object myObj = new String[]{"one", "two", "three"};
。这条线是一样的Vehicle v = new Car();
吧?在这两行中,我们都将子类对象分配给超类引用变量。String[]myObj
但是允许向下转换,但(Bike)v
不允许。正如评论中提到的,我还尝试使用自行车来扩展 Car。根据这里的一些讨论,自行车不是汽车,因为它是扩展车辆。如果我通过 Bike 扩展 Car,则意味着 Bike 是 Car 的一种,但仍然存在例外。
请帮助我了解这里发生了什么。
Ps - 请不要把整辆汽车改装成自行车,把自行车改装成汽车;)