哪些方法在Java中是动态绑定的



问题说的是,哪些方法在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();

将编译,但会抛出运行时异常。

相关内容

  • 没有找到相关文章

最新更新