为什么java中不允许这种降级?

为什么java中不允许这种降级?,java,oop,polymorphism,downcast,Java,Oop,Polymorphism,Downcast,假设我有一个超类Animal,还有一个子类Dog 我们可以说: Animal a = new Dog(); Dog b = new Animal(); 我们不能沮丧地说: Animal a = new Dog(); Dog b = new Animal(); 所以我明白动物不一定是狗。但是,为什么把动物“蓝图”放在狗的容器里会有例外呢?因为狗从动物那里继承方法,当我们把这个动物放到狗的容器中时,我们知道狗继承/覆盖了动物拥有的所有方法,所以为什么Java不允许这样做呢 谢谢大家! 简而言

假设我有一个超类
Animal
,还有一个子类
Dog

我们可以说:

Animal a = new Dog();
Dog b = new Animal();
我们不能沮丧地说:

Animal a = new Dog();
Dog b = new Animal();
所以我明白动物不一定是狗。但是,为什么把动物“蓝图”放在狗的容器里会有例外呢?因为狗从动物那里继承方法,当我们把这个动物放到狗的容器中时,我们知道狗继承/覆盖了动物拥有的所有方法,所以为什么Java不允许这样做呢


谢谢大家!

简而言之:因为狗是动物,但动物不一定是狗

稍长一点的回答:如果你能做到这一点,你可以调用
Animal
对象上的
Dog
方法,该对象不一定定义这些方法

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

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

虽然我们知道狗包括动物的所有方法,但我们不知道动物包括狗的所有方法

例如,考虑Dog是否添加了一个方法bark()。我们应该能够对Dog类型的任何对象调用bark();但是如果我们能在那里储存动物,我们可以储存任何类型的动物,比如猫。然后我们会发现自己让一只猫叫,结果会出大问题


我们可以说狗是动物,猫是动物,但我们不能说动物是狗,猫是狗。因此,如果我们的变量“是一只狗”,那么在那里存储一只动物是没有意义的。

想想看,当你说“动物”时,你不能自动假定它是一只狗。但你可以换一种方式