请问一下代码执行的结果为什么是hello hello hello?请详细说明,谢谢
public class A{
  protected void hello(object a){
    System.out.println("hello tom");
  }
}
public class B extends A{
  protected void hello(String s){
    System.out.println("hello mike");
  }
  protected void hello(Object o){
    System.out.println("hello");
  }
  public static void main(String[] args){
    Object arg1 = "AAA";    B b = new B();
    b.hello(arg1);    A a = new B();
    a.hello(arg1);    String arg2 = "ABC";
    a.hello(arg2);
  }
}

解决方案 »

  1.   

    实例化时,子类覆盖了父类的方法,所以后两个是:hello了
      

  2.   

    我觉得是这样的.首先Java里面的继承机制是自上而下的,即子类可以继承父类的所有符合访问规则的属性,方法等.
    对于你这段代码.
    1.对于
    B b = new B();
    b.hello(arg1);
    创建的是类B的实例,自然会使用B中的方法.2.对于
    A a = new B();
    a.hello(arg1);
    声明的是父类,但是创建的是子类的实例,这个时候是对hello(Object)方法的覆盖。
    即还是会使用子类的方法.3.对于
    A a = new B();
    String arg2 = "ABC";
    a.hello(arg2);父类A中只有一个 hello(Object)方法,你在使用 a.的时候也只能看到这个方法.
    而子类B中的 hello(String)对于父类是不可视的,之所以能运行是因为String类本身就是Object类的子类.
    子类到父类可以进行自动的类型转化,所以3其实和2是一样的.
    你可以把B中的方法改成 hello(int).你看能不能调用到.以上是个人看法,希望高手批评。
      

  3.   

    B extends A 所以 A的hello()在B中重新实现,b.hello("AAA"),a.hello("AAA")是hello,而最后一个是String 是object的一个对象,调用a.hello 时,转换成object,然后对应b.hello(objec ~)
      

  4.   

    // B向上转型为A,A只有hello(Object object) 方法,但注意调用的是B的hello(Object object) 版本,而不是A的A a = new B();
    a.hello(arg1);
    // 同理,a.hello(arg2)也是调用B的hello(Object object)方法,只不过是先把args2转型为Object了
    String arg2 = "ABC";
    a.hello(arg2);
      

  5.   

    wangxiaojie0506(SUN认证篮球) 分析的很正确
      

  6.   

    wangxiaojie 说的非常明白,我不必多说了