假设我有一个 Animal 的超类,以及 Dog 的子类 .
Animal
Dog
我们可以说:
Animal a = new Dog();
我们不能低声说:
Dog b = new Animal();
所以我明白动物不一定是狗 . 但是,为什么在狗容器中有动物“蓝图”会抛出异常呢?因为Dog继承了Animal的方法,当我们把这种动物放入狗容器中时,我们知道Dog继承/覆盖了Animal所有的方法,那为什么Java不允许这样呢?
谢谢!
Dog b = new Animal(); b.Woof();
Animal没有名为Woof()的接口/方法 . 它不知道如何像狗一样行事,但所有的狗都知道如何像动物一样行事 .
简短回答:因为狗是动物,但动物不一定是狗 .
稍微长一点的回答:如果你能够做到这一点,你可以在 Animal 对象上调用 Dog 方法,这些方法不一定定义那些方法 .
虽然我们知道Dog包含Animal的所有方法,但我们不知道Animal包含Dog的所有方法 .
例如,如果Dog添加了方法bark() . 我们应该能够在Dog类型的任何对象上调用bark();但如果我们可以在那里存放动物,我们可以存储任何类型的动物,比如说Cat . 然后我们发现自己要求一只猫吠(),而且会出现问题 .
我们可以说狗是动物,猫是动物,但我们不能说动物是狗,或者猫是狗 . 因此,如果我们的变量"is a Dog",存储一个Animal就没有意义了 .
3 回答
Animal没有名为Woof()的接口/方法 . 它不知道如何像狗一样行事,但所有的狗都知道如何像动物一样行事 .
简短回答:因为狗是动物,但动物不一定是狗 .
稍微长一点的回答:如果你能够做到这一点,你可以在
Animal
对象上调用Dog
方法,这些方法不一定定义那些方法 .虽然我们知道Dog包含Animal的所有方法,但我们不知道Animal包含Dog的所有方法 .
例如,如果Dog添加了方法bark() . 我们应该能够在Dog类型的任何对象上调用bark();但如果我们可以在那里存放动物,我们可以存储任何类型的动物,比如说Cat . 然后我们发现自己要求一只猫吠(),而且会出现问题 .
我们可以说狗是动物,猫是动物,但我们不能说动物是狗,或者猫是狗 . 因此,如果我们的变量"is a Dog",存储一个Animal就没有意义了 .