我们假设我有一个Animal
的超类,以及Dog
的子类。
我们可以说:
Animal a = new Dog();
我们不能低声说:
Dog b = new Animal();
所以我明白动物不一定是狗。但是,为什么会有动物"蓝图"在一个狗容器中抛出异常?因为Dog继承了Animal的方法,当我们把这种动物放入狗容器中时,我们知道Dog继承/覆盖了Animal所有的方法,那么为什么Java不允许这样做呢?
谢谢!
答案 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>狗,或者猫是狗。因此,如果我们的变量“是狗”,那么存储动物是没有意义的。