标签:必须 信息 特殊 font bsp new pre square 术语
话不多说,先上源码
public class olymorphism { public static void main(String[] args) { Shap circle = new Circle(); Painter painter = new Painter(); painter.paint(circle); } } class Shap{ void draw(){ System.out.println("shap.draw()"); } } class Circle extends Shap{ void draw() { System.out.println("circle.draw()"); } } class Square extends Shap{ void draw() { System.out.println("square.draw()"); } } class Painter{ void paint(Shap shap) { shap.draw(); } }
程序输出结果:circle.draw()
这个例子在多态的向上造型中很常见了,Painter类中传入的引用类型是父类Shap,这样可以不用写其它形状的paint方法。这里主要是想分享一下think in java中提到的一个方法的绑定概念。
将一个方法调用同一个方法主体连接到一起就称为“绑定”(Binding)。若在程序运行以前执行绑定(由编译器和链接程序,如果有的话),就叫作“早期绑定”。大家以前或许从未听说过这个术语,因为它在任何 程序化语言里都是不可能的。C 编译器只有一种方法调用,那就是“早期绑定”。 上述程序最令人迷惑不解的地方全与早期绑定有关,因为在只有一个 Shap 句柄的前提下,编译器不知道具体该调用哪个方法。 解决的方法就是“后期绑定”,它意味着绑定在运行期间进行,以对象的类型为基础。后期绑定也叫作“动态绑定”或“运行期绑定”。若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。也就是说,编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的。但我们至少可以这样认为: 它们都要在对象中安插某些特殊类型的信息。
Java 中绑定的所有方法都采用后期绑定技术,除非一个方法已被声明成final。这意味着我们通常不必决定 是否应进行后期绑定——它是自动发生的。
为什么要把一个方法声明成final 呢?因为它能防止其他人覆盖那个方法。但也许更重要的一点是,它可有效地“关闭”动态绑定,或者告诉编译器不需要进行动态绑定。这样一来,编译器就可
为 final 方法调用生成效率更高的代码。
知道 Java 里绑定的所有方法都通过后期绑定具有多形性以后,就可以相应地编写自己的代码,令其与基础类沟通。此时,所有的衍生类都保证能用相同的代码正常地工作。或者换用另一种方法,我们可以“将一条消息发给一个对象, 让对象自行判断要做什么事情。”
标签:必须 信息 特殊 font bsp new pre square 术语
原文地址:http://www.cnblogs.com/xuyunqi/p/8011297.html