将一个方法调用同一个方法主体连接到一起就称为绑定(Binding)若在程序运行以前执行绑定(由编译器和链接程序如果有的话)就叫作早期绑定大家以前或许从未听说过这个术语因为它在任何程序化语言里都是不可能的C编译器只有一种方法调用那就是早期绑定 上述程序最令人迷惑不解的地方全与早期绑定有关因为在只有一个Instrument句柄的前提下编译器不知道具体该调用哪个方法 解决的方法就是后期绑定它意味着绑定在运行期间进行以对象的类型为基础后期绑定也叫作动态绑定或运行期绑定若一种语言实现了后期绑定同时必须提供一些机制可在运行期间判断对象的类型并分别调用适当的方法也就是说编译器此时依然不知道对象的类型但方法调用机制能自己去调查找到正确的方法主体不同的语言对后期绑定的实现方法是有所区别的但我们至少可以这样认为它们都要在对象中安插某些特殊类型的信息 Java中绑定的所有方法都采用后期绑定技术除非一个方法已被声明成final这意味着我们通常不必决定是否应进行后期绑定——它是自动发生的 为什么要把一个方法声明成final呢?正如上一章指出的那样它能防止其他人覆盖那个方法但也许更重要的一点是它可有效地关闭动态绑定或者告诉编译器不需要进行动态绑定这样一来编译器就可为final方法调用生成效率更高的代码 |