重写的方法支持多态性

尽管上一节的示例说明了方法重写的机制,但是还不能显示出他们强大的功能.的确,如果方法重写只是一个名称空间的约定,那么他至多也只是令人好奇,没有什么实际的价值.然而,情况并非如此.方法重写组成了Java最强大的概念之一:动态方法分配(Dynamic method dispatch)动态方法分配是一种机制,通过该机制对一个被重写的方法调用会在运行时解析,而不是在编译时解析.动态方法分配是一种机制,通过该机制对一个被重写方法的调用会在运行时解析,而不是编译时解析.动态方法分配是十分重要的,因为他是Java实现运行时多态性的机制.
我们再从超类引用变量可以引用子类对象这一重要原理开始讨论.Java利用这一事实解决了运行时对被重写方法的调用.办法如下:当通过超类引用调用被重写方法时,Java会根据在调用发生时引用的对象的类型来判断所要执行的方法.因此,这种判断发生在运行时.当引用不同类型对象时,将调用被重写方法的不同版本.换言之,是被引用对象的类型(而不是引用变量的类型)决定了所要执行的被重写方法.因此,如果超类包含被子类重写的方法,那么当通过超类引用变量引用不同的对象类型时,就会执行不同版本的方法.
下面演示一个动态方法分配示例:
public class test2
{
    // @param args
    public static void main(String args[])
    {
     one ob1 = new one();
     two ob2 = new two();
     three ob3 = new three();
     
     one resource;
     
     resource = ob2;
     resource.who();
     
     resource = ob3;
     resource.who();
     
    }
}
class one
{
    void who()
    {
        System.out.println("one");
    }
}
class two extends one
{
    void who()
    {
        System.out.println("two");
    }
}
class three extends two
{
    void who()
    {
        System.out.println("three");
    }
}
输出:
two
three
在每一种情况下要调用的who()的版本在运行时由引用的对象类型决定,而不是由resource的类类型决定.
Java中的被重写方法看起来很像C++中的虚函数,他们有相似之处吗?
答:是的,熟悉C++的读者会意识到Java中的被重写方法在目的上与虚函数一样,在操作上与其相似.