Java 编译器(几乎)总是在编译时解析静态方法,这是一个普遍的事实。例如:
public class Super {
static void someMethod() {
// Do something...
}
}
public class Derived extends Super {
// Some other methods, excluding someMethod
}
测试代码:
Derived derived = new Derived();
derived.someMethod();
这应该调用 Super.someMethod(),对吧?它应该在编译时解决,以便 javac 会生成invokestatic Super.someMethod
,但我已经看到它会生成invokestatic Derived.someMethod
. 为什么要这样做?有没有办法以某种方式改变这种行为?
请纠正我,如果我错了。