因为h是Hero类型的,多态性不就是这么实现的么:)这里编译一样会动态编译的,跟c++里面你一定要用virtual关键字不同,不知道你是不是想问这个。

解决方案 »

  1.   

    w(h)方法中,变量是h,是Hero类型,你这样放进去,肯定不会调用ActionCharacter 中的方法,而是下朔造型了。。
    如果:ActionCharacter a = new ActionCharacter();
    w(a); // Treat it as an ActionCharacter显示的是:print class ActionCharacter!!!
      

  2.   

    agree因为h的实例是Hero类型的。
      

  3.   

    to bluesmile979(笑着)  还是个初手有不对的地方别见笑!你可以这样看
    public class Adventure {
      static void t(CanFight x) { x.fight(); }
      static void u(CanSwim x) { x.swim(); }
      static void v(CanFly x) { x.fly(); }
      static void w(ActionCharacter x) { x.fight(); }
      public static void main(String[] args) {
        Hero h = new Hero();
        t(h); // Treat it as a CanFight
    System.out.println("**********************************");
        u(h); // Treat it as a CanSwim
        v(h); // Treat it as a CanFly
        w((ActionCharacter )h); // Treat it as an ActionCharacter
      }

    注意我强制转换了类型w((ActionCharacter )h),输出依然没有变化!
    我觉得static void w(ActionCharacter x) { x.fight(); }只会接受ActionCharacter类型或者是他的基础类,而Hero不是他的基础类!
    不知理解的对不对?
      

  4.   

    呵呵,我还是个初手有不对的地方别见笑! 
    to  xieha(罗马假日)  你的意思我理解,我不明白的是为什么这里的转换没有起到预期的作用!谢谢!
      

  5.   

    呵呵,还真没见过这么写的,那里只是类型定义,应该不涉及到类型转换一类的东西吧:)而且实际上h传给他就已经是ActionCharacter类型的了,但由于动态联编的作用,他会调用的是最初new时候的类的方法,好像你对多态理解还有问题。要想要你要的结果,参数实例化的地方必须要是ActionCharacter的,而按你的要求Hero子类在这里也失去了存在的意义。