随着这一行的隐式上行:
Animal myAnimal = myDog;
您没有做任何更改基础实例的操作myDog
。您正在做的就是将其分配给继承树中一级更高级别的变量。有效地,这限制了只能调用在中定义的方法Animal
,而不会改变这些方法的解析方式。
由于您已将只能使用的方法限制为在父类上定义的方法Animal
,因此编译器无法解析Dog#bark()
,因为它是的方法Dog
,并且变量myAnimal
被定义为Animal
没有#bark
方法的类型。
#move()
是两者的方法Animal
和Dog
,所以它解决,但它解析为上定义的方法Dog
中,由于myAnimal
仍然是指的一个实例Dog
,尽管是向上转型。