动态方法调度是很重要的,因为这也是Java实现运行时多态性的基础。让我们从重述一个重要的原则开始:超类的引用变量可以引用子类对象。Java用这一事实来解决在运行期间对重载方法的调用。过程如下:当一个重载方法通过超类引用被调用,Java根据当前被引用对象的类型来决定执行哪个版本的方法。如果引用的对象类型不同,就会调用一个重载方法的不同版本。换句话说,是被引用对象的类型(而不是引用变量的类型)决定执行哪个版本的重载方法。因此,如果超类包含一个被子类重载的方法,那么当通过超类引用变量引用不同对象类型时,就会执行该方法的不同版本。这段话读的我有些头大?class A {
void callme() {
System.out.println("Inside A's callme method");
}
}
class B extends A {
// override callme()
void callme() {
System.out.println("Inside B's callme method");
}
}
class C extends A {
// override callme()
void callme() {
System.out.println("Inside C's callme method");
}
}
class Dispatch {
public static void main(String args[]) {
A a = new A(); // object of type A
B b = new B(); // object of type B
C c = new C(); // object of type C
A r; // obtain a reference of type A
r = a; // r refers to an A object
r.callme(); // calls A's version of callme
r = b; // r refers to a B object
r.callme(); // calls B's version of callme
r = c; // r refers to a C object
r.callme(); // calls C's version of callme
}
}
就像这段程序,输出结果
Inside A’s callme method
Inside B’s callme method
Inside C’s callme method
完全是合情合理的,为什么还讲这么一大段话呢?程序倒是读明白了,可是这段话让我变糊涂了。哪位朋友帮我解释一下吧。谢谢。本人比较菜。

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/4897/4897082.xml?temp=.4820978
      

  2.   

    呵呵,怪不得觉得面熟,原来楼主看的这本书我看过。既然程序已经看懂了,那只需要明确那段话的两点就可以了:
    1、超类的引用变量可以引用子类对象。
    例如,class A,class B extends A,那么可以写A a = new B();
    用一个A类的引用变量来引用B类对象。
    2、被引用对象的类型(而不是引用变量的类型)决定执行哪个版本的重载方法
    例如,class A包含abc方法,class B extends A,并且class B也写了一个相同参数的abc方法。
    那么如果你声明A a = new B();
    然后写a.abc();
    那么最后执行的其实是class B中的abc方法,因为被引用的其实是一个B对象。
      

  3.   

    class Dispatch {
    void f(A a)
    {
      a.callme();//在这里就是动态调用方法;
    }public static void main(String args[]) {
    A a = new A(); // object of type A
    B b = new B(); // object of type B
    C c = new C(); // object of type C
    Dispatch d=new Dispatch ();
     d.f(a);
     d.f(b);
     d.f(c);
    }
    }
      

  4.   

    f方法中调用callme()方法,更能体现楼主的那一段关于多态的含义