为什么在java中不允许这种贬低?

时间:2015-04-27 23:48:57

标签: java oop polymorphism downcast

我们假设我有一个Animal的超类,以及Dog的子类。

我们可以说:

Animal a = new Dog();

我们不能低声说:

Dog b = new Animal();

所以我明白动物不一定是狗。但是,为什么会有动物"蓝图"在一个狗容器中抛出异常?因为Dog继承了Animal的方法,当我们把这种动物放入狗容器中时,我们知道Dog继承/覆盖了Animal所有的方法,那么为什么Java不允许这样做呢?

谢谢!

3 个答案:

答案 0 :(得分:5)

Dog b = new Animal();
b.Woof();

Animal没有名为Woof()的接口/方法。它不知道如何表现得像狗一样,但所有的狗都知道如何表现得像动物。

答案 1 :(得分:2)

简短回答:因为狗是动物,但动物不一定是狗。

稍微长一点的回答:如果你能够这样做,你可以在Dog对象上调用Animal方法,这些方法不一定定义那些方法。

答案 2 :(得分:1)

虽然我们知道Dog包含Animal的所有方法,但我们不知道Animal包含Dog的所有方法。

例如,考虑Dog添加方法bark()。我们应该可以在Dog类型的任何对象上调用bark();但如果我们可以在那里存放动物,我们可以存储任何类型的动物,比如说Cat。然后我们发现自己要求猫吠(),而且会出现问题。

我们可以说狗动物,而猫动物,但我们不能说动物 em>狗,或者猫狗。因此,如果我们的变量“是狗”,那么存储动物是没有意义的。