让我们尝试以与编译器相同的方式查看此行:
animal.dogMethod();
首先,它需要弄清楚是什么
animal意思。很好而且很容易-它是当前方法中的局部变量,因此它不需要花很多时间。
该变量的编译时类型为
Animal。编译器不在乎在执行时变量的 值 是什么-它仅使用有关已声明类型的信息。
因此,这就是它用来尝试查找,即type
dogMethod()上下文中的含义的方式。首先它查找,然后是(的隐式超类)-但这些类都不包含的声明。到那时,编译器不得不放弃一个错误-
它找不到方法。该方法可在该值所引用的对象的 执行时
类型上使用。它只能在编译时使用编译时可用的信息来绑定它。
animal``Animal``Animal``java.lang.Object``Animal``dogMethod
__
animal
在 执行 时唯一的决定是使用哪种方法的实现-例如,如果您调用了
animal.toString()并且
Dog该类具有重写,例如
@Override public String toString() { return "I'm a dog";}那么编译器会发现
toString(),从方法
java.lang.Object,所以它会知道该方法调用是有效的-但在 执行
中
Dog会因为对象的运行时类型的使用。



