Java中的绑定

静态类型和动态类型


任何一个引用变量都有两个类型:一个叫静态类型,也就是定义该引用变量的类型;另一个叫动态类型,也就是该引用实际指向的对象类型。

A a = new B();
那么,引用a的静态类型就是A,动态类型就是B。

编译看左边,运行看右边。
java中引用的静态类型再编译的时候就可以确认,但是编译器无法得知这个引用的动态类型;只有程序运行时,通过RTTI(run time type identification, 运行时类型检查)就可检查出引用的动态类型。

  • 绑定

对于一个程序,可以有很多的方法。这些方法的名称、参数类型和参数数量都可能相同或者不同,那么再调用一个方法的时候,如何将一个方法和该方法所在的类关联起来,这就是绑定。java中的绑定分为动态绑定和静态绑定。

  • 静态绑定

所有依赖于静态类型来将方法和该方法所在的类关联起来的动作就是静态绑定。因为静态绑定发生在编译时期,所以又叫前期绑定。

  • 动态绑定

所有依赖动态类型来将方法和方法所在的类进行关联的动作就是动态绑定。以为动态绑定实在程序运行时,通过RTTI实现,所以又叫后期绑定。

  • 举个栗子

有父类Father和子类Son,子类重写了父类中的某个方法method()。

Father father = new Son();
father.method();

在这个栗子中,静态绑定的过程是:java文件编译时,编译器检查出引用father的静态类型时Father类,于是将method()方法和父类Father关联起来。也就是说,程序运行前编译器是无法检查出引用father的动态类型的,所以会直接调用静态类型中的方法。

而动态类型的过程是:当这个java程序运行起来了,RTTI检查出引用father的动态类型是Son类时,会将method()方法和子类Son关联起来,也就是确定调用动态类型Son类中的method方法。具体过程为:1. JVM提取对象的实际类型的方法表;2. JVM搜索方法签名;3. 调用方法。

java中的类的属性都是静态绑定。这是因为静态绑定是有很多的好处,他可以让我们在编译器就发现程序中的错误,而不是在运行期。这样就可以提高程序的运行效率!而对方法采用动态绑定是为了实现多态。

你可能感兴趣的:(Java中的绑定)