请在这里查看此代码。
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
不允许。正如评论中所提到的,我也试图用自行车扩展汽车。根据这里的一些讨论,自行车不是一辆车,因为它正在扩展车辆。如果我通过自行车延长汽车,那么这意味着自行车是一种汽车,仍然是例外。
请帮助我了解这里发生的事情。
请注意 - 请不要把整个改装车转为自行车,自行车到车上;)
答案 0 :(得分:2)
两者之间的主要区别是示例是Object myObj = new String[]{"one", "two", "three"};
这里myObj
将引用一个String数组,并且因为引用的值确实是一个字符串数组,所以你可以将它转换为一个。
在另一个示例Bike b = (Bike)v;
中,b
的引用值将为Car
。由于Car
不是完整的Bike
。自行车可以实现更多的汽车,汽车不知道的事情。因此,您无法将Car
转换为Bike
答案 1 :(得分:2)
两者不一样:(String[])myObj
是允许的,因为myObj
是String[]
个实例。但是(Bike)v
是不允许的,因为v
不是Bike
或其任何超类的实例(它是Car
实例)。
答案 2 :(得分:0)
不,所提供的代码与基本句子中示例中的代码不同:
//you're declaring a Object class variable
Object myObj = new String[]{"one", "two", "three"};
//you're declaring a Car class instance, not a Vehicle
Vehicle v = new Car();
他们不一样。在第一个示例中,您使用父类来保存值,在第二个示例中,您正在使用子类并分配父值,但该对象将是子级,而不是父级。
让我们看一下课程构成,以获得进一步的解释:
Object
- String[]
- Vehicle
- Car
- Bike
如您所见,每个String[]
都是Object
,现在每个Car
都是Vehicle
,但Car
不是Bike
{1}}。用代码解释
Vehicle v = new Car();
//v contains an instance of Car
Car c = v;
//a Car is not a Bike, this line will throw an error
Bike b = c;
//v2 contains an instance of Vehicle
Vehicle v2 = new Vehicle();
//a Car is a Vehicle
Car c2 = v2;
//a Bike is a Vehicle
Bike b2 = v2;