1

请在此处查看此代码。

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 + ".");


    }
}

执行此代码将给出ClassCastExceptioninheritance.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 - 请不要把整辆汽车改装成自行车,把自行车改装成汽车;)

4

3 回答 3

2

Object myObj = new String[]{"one", "two", "three"};两者的主要区别在于 examplemyObj将引用一个 String 数组,并且由于引用的值确实是一个 Strings 数组,因此您可以将其强制转换为一个。在另一个示例Bike b = (Bike)v;中, 的引用值b将是 a Car。而且既然Car不是完整的Bike。自行车可能比汽车执行更多,汽车不知道的事情。因此,您不能将 aCar转换为 aBike

于 2012-09-03T21:29:14.780 回答
2

两者不一样:(String[])myObj是允许的,因为myObjString[]实例。但是(Bike)v不允许,因为v它不是 aBike或其任何超类的实例(它是一个Car实例)。

于 2012-09-03T21:36:06.110 回答
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

如您所见, eachString[]将是 a Object,现在 eachCar将是 a Vehicle,但 aCar不是 a Bike。用代码解释

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;
于 2012-09-03T21:20:58.513 回答