Java中的双重调度

时间:2013-01-25 06:13:11

标签: java polymorphism object-reference double-dispatch

我不确定我是否对双重调度有错误的想法。但这就是我的想法:

class A{
   void testA( B obj ){
         System.out.println( "A-Parent" );
          obj.testB();
   }
}


class AChild extends A{
   void testA( B obj ){
         System.out.println( "A-Child" );
         obj.testB();
   }
}


class B{
   void testB(){
         System.out.println( "B-Parent" );
   }
}


class BChild extends B{
   void testB(){
         System.out.println( "B-Child" );
   }
}

class Launcher{
  public static void main(){
  A objA = new AChild();
  B objB = new BChild();

  objA.testA(objB);
  }
}

What I expected:

A-Child
B-Parent

Actual output:

A-Child
B-Child   // How ???????

由于Javas Single diapatch,我认为Java在运行期间正确解析了对Achild的objA,而参数在编译期间被解析为B.请告诉我哪里弄错了?

2 个答案:

答案 0 :(得分:1)

不明白为什么应该打印'B-Parent'而不是'B-Child'

     B objB = new BChild();
     objA.testA(objB);

objB 实际上有一个B的孩子实例。所以 B-Child 会被打印出来。所以这是Java的运行时绑定或多态性功能:)

答案 1 :(得分:-3)

您需要使用http://en.wikipedia.org/wiki/Visitor_pattern在java中实现双重调度。