Java向下倾斜的困境

时间:2012-09-03 21:17:40

标签: java

请在这里查看此代码。

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不允许。正如评论中所提到的,我也试图用自行车扩展汽车。根据这里的一些讨论,自行车不是一辆车,因为它正在扩展车辆。如果我通过自行车延长汽车,那么这意味着自行车是一种汽车,仍然是例外。

请帮助我了解这里发生的事情。

请注意 - 请不要把整个改装车转为自行车,自行车到车上;)

3 个答案:

答案 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是允许的,因为myObjString[]个实例。但是(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;