问题是什么,Java中哪些方法是动态绑定的?
来自 C++,如果我没记错的话,大多数方法都是静态绑定的,只有少数例外。
理论上,所有方法都是动态绑定的,除了
实际上,在运行时,JVM 可能会选择 JIT 编译某些方法调用以静态解析,例如,如果没有加载的类包含覆盖方法。
实例方法调用在运行时解析,静态方法调用在编译时解析。
一般来说,您可以这样想:在编译时,编译器会检查静态绑定。在运行时检查动态类型。
例如:
Class A{
public void function x(){ print("x"); }
}
Class B extends A{
public void function x(){ print("y"); }
public void function m(){ print("m"); }
}
public static void main(){
A a = new B();
a.x(); //1
a.m(); //2
((B)a).m(); //3
}
*请注意,在最后一种情况下,编译器只检查继承的可能性,而不是 B 对象。例如:
A a = new A();
((B)a).m();
将编译但抛出运行时异常。