1

问题是什么,Java中哪些方法是动态绑定的?

来自 C++,如果我没记错的话,大多数方法都是静态绑定的,只有少数例外。

4

3 回答 3

4

理论上,所有方法都是动态绑定的,除了

  • 静态方法
  • 构造函数
  • 私有方法
  • 最终方法

实际上,在运行时,JVM 可能会选择 JIT 编译某些方法调用以静态解析,例如,如果没有加载的类包含覆盖方法。

于 2011-09-17T08:25:31.047 回答
3

实例方法调用在运行时解析,静态方法调用在编译时解析。

于 2011-09-17T08:20:12.323 回答
0

一般来说,您可以这样想:在编译时,编译器会检查静态绑定。在运行时检查动态类型。

例如:

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
}
  • in 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();

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

于 2011-09-17T09:15:59.647 回答