问题说的是,哪些方法在Java中是动态绑定的?
来自c++,如果我没弄错的话,除了少数例外,大多数方法都是静态绑定的。
理论上,所有的方法都是动态绑定的,除了
- 静态方法 <
- 构造函数/gh>
- 私有方法 <
- 最终方法/gh>
实际上,在运行时,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
}
- 在1中可以编译,因为a的静态类型是a,并且a有一个名为X的函数,但在运行时将识别为B对象,并打印'y'
- 在2中会出现编译错误,因为a是a类型的,并且a类没有称为m的函数。 在
- 3中,将检查继承B->A是否合法,然后检查类B是否有一个名为m的函数。
*注意,在最后一种类型转换中,编译器只检查继承的可能性,而不检查是否存在B对象。例如:
A a = new A();
((B)a).m();
将编译,但会抛出运行时异常。