哪些方法在Java中动态绑定?

时间:2011-09-17 08:15:48

标签: java dynamic-binding

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

理论上,除了

之外,所有方法都是动态绑定的
  • 静态方法
  • 构造
  • 私人方法
  • 最终方法

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

答案 2 :(得分:0)

一般来说,你可以把它想象成这样: 在编译时,编译器检查静态绑定。 在运行时,检查dinamic类型。

例如:

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'
  • in 2将出现编译错误,因为a类型为A,而类A没有名为m的函数。
  • in 3将检查继承B-> A是否合法,然后如果B类有一个名为m的函数。

*请注意,在最后一次转换的情况下,编译器只会检查继承的可能性,而不会检查是否存在B对象。 例如:

A a = new A();
((B)a).m();

将编译但抛出runntime异常。