你这是子类方法覆盖父类方法,不是调用的重载函数,所以应该为SuperA operation S
如果你把private static Super a;声明改为private static SuperA a;
这样会调用相应的重载方法,结果就会如你所愿: SuperA operation B

解决方案 »

  1.   

    huyc_fly() ( ) 信誉:100  2006-6-10 12:08:50  得分: 0  
     
     
       
    你这是子类方法覆盖父类方法,不是调用的重载函数,所以应该为SuperA operation S
    如果你把private static Super a;声明改为private static SuperA a;
    这样会调用相应的重载方法,结果就会如你所愿: SuperA operation B  
     
    调用的是是子类的public void opration(SuperA a){
      System.out.println("SuperA operation A!");
    }
    public void opration(SuperB b){
      System.out.println("SuperA operation B!");
    }
    public void opration(Super s){
      System.out.println("SuperA operation S!");
    }
    这3个当中的哪个??
    因为参数是SuperB,所以应该是SuperA operation B才对啊
      

  2.   

    当然是和父类一样的方法:
    public void opration(Super s){
      System.out.println("SuperA operation S!");
    }
    参数SuperB被向上转型为父类的类型了;不信,你把子类中的这个方法注释掉,那么它实际调用的将是父类中的那个方法;
    由于你生成的对象a=new SuperA();是由一个父类的引用类型来指向子类的对象,那么实际上它能调用的方法也就只能在父类的范围中;本来它应该执行父类中的那个方法,但是你子类中覆盖了父类的方法,所以它实际执行的将是子类中的方法,这就是多态!
      

  3.   

    kill8108(日月之光)不是说了吗.“摇控器永远是摇控器,不能认为指向了电视机就会变成了电视机。”SuperA不也是Super的子类吗.