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



