基本概念
动态绑定和静态绑定是Java中两个重要的概念。首先思考这么一个问题,当一个类中存在方法名相同但参数不同(重载)的函数或同一类层次结构下同一名称的方法(重写),程序在执行的时候该如何辨别区分呢?这里就需要用到Java中的动态绑定和静态绑定来解决。那么什么是动态绑定和静态绑定呢?
- 绑定:指一个方法的调用与方法所在的类关联起来
- 静态绑定:方法在程序编译期进行绑定
- 动态绑定:方法在程序运行时根据具体对象的类型进行绑定
静态绑定 VS 动态绑定
- 静态绑定发生在编译期(Compile time),而动态绑定发生在运行时(Runtime)
private
,final
andstatic
方法和变量使用静态绑定,而虚函数(virtual methods)则会根据运行时的具体对象进行绑定- 静态绑定使用的是类信息,而动态绑定使用的是对象信息
- 重载方法(overloaded methods)使用的是静态绑定,而重写方法(overridden methods)使用的是动态绑定
虚函数:在Java语言中, 所有的方法默认都是”虚函数”。只有以关键字 final 标记的方法才是非虚函数。虚函数是面向对象编程实现多态的基本手段。
静态绑定示例
例1:
class A {
public void hello(String str) {
System.out.println("a String instance in A");
}
public void hello(Object str) {
System.out.println("a Object instance in A");
}
}
public class BindingDemo {
public static void main(String args[]) {
String str = "";
Object obj = "";
A a = new A();
a.hello(str);
a.hello(obj);
}
}
输出结果:
a String instance in A
a Object instance in A
分析:可以看出,在A中有两个同名但参数不同的方法(重载),在调用方法a.hello()时,程序会自动根据输入的参数类型来选择具体调用哪个方法,其后的原理就是静态绑定,即在编译期根据参数类型进行静态绑定。