所有方法签名和变量都在编译时进行验证,但实际的方法调用在运行时完成/解析。
例如 :
class A {int i=5;public void doSomething(){//print "in A"}}class B extends A{int i=10; public void doSomething(){// print "in B"}public static void main(String[] args){A a = new B();a.doSomething();}}现在,当您调用时
a.doSomething();,在编译过程中,编译器仅检查是否
doSomething()为类A定义了(lhs参考)。甚至不必担心是否也为类B定义了该方法。即使该方法不存在
B,该程序也可以正常编译。
接下来,在运行时,JVM根据对象的类型(
B根据您的情况)动态决定要调用的方法。
因此,
"in B"被打印。
现在,回到领域。在编译期间将解决对字段的访问。因此,如果在编译期间不存在任何字段,则编译将失败。这些字段根据引用类型进行调用。因此,
a.i将打印
5(
A's值
i),因为该字段在编译时已解决。因此,不同之处在于,方法调用在运行时解析,在编译时需要/检查其签名,而在编译时则检查/解析字段。



