public class Parent {}
public class Sub extends Parent {}
public class A {
 public void fun(Parent p){
  System.out.println("A");
 }
}public class B extends A {
 public void fun(Sub s){
  System.out.println("B");
 }
}public class Test {
 public static void main(String[] args) {
  Sub s = new Sub();
  Parent p = s;
  B b = new B();
  A a = b;
  
  a.fun(p);
  a.fun(s);
  b.fun(p);
  b.fun(s);
 }
}

解决方案 »

  1.   

    A
    A
    A
    B
    正确答案
      

  2.   

    Java里没指针,C++里用指针很好解释这个问题
      

  3.   

    这有啥好解释的,B中fun函数实际上是重载了。
     b.fun(p);
    当然是调用从A继承下来的fun(Parent p)函数
      

  4.   

    b.fun(p)
    在class B中存在从class A继承下来的
    public void fun(Parent p){
      System.out.println("A");
     }
    方法,而且Parent不能被转换成Sub,所以不可能调用
     public void fun(Sub s){
      System.out.println("B");
     }
      

  5.   

    差点看成子类class B 重写fun()方法了。
    对象a引用子类对象,调用fun()方法时,由于子类没有重写父类的fun()方法,所以不构成多态,实际上调用的都是父类的fun()方法。
    class B中通过继承造成了fun()方法的重载,上面已有大仙给出分析了.重写是是子类与父类之间的多态性,对父类的函数进行重新定义,与其父类有相同的函数名称和参数。
      

  6.   

    a.fun(s);
    因为 s 是集成了 parent
    所以 s是可以转成parent的
    因为A里没有 参数为S的方法  但是有P的方法
    所以s强制转换p故 打印A~~
    我的理解对不
      

  7.   

    这个问题考察的核心在与:理解,多态、继承。
    public class Parent {}
    public class Sub extends Parent {}
    public class A {
     public void fun(Parent p){
      System.out.println("A");
     }
    }public class B extends A {
     public void fun(Sub s){
      System.out.println("B");
     }
    } Sub s = new Sub();
      Parent p = s;
      B b = new B();
      A a = b;
       在调用fun方法的时候首先判断传入的参数是什么
      a.fun(p);  传入的是Parent对象,只能执行A中的fun方法。
      a.fun(s); 传入的是Parent子类对象,a对象不能调用其子类B中的fun 方法,只能执行其自己的fun方法。
      b.fun(p); 传入的是Parent对象,b对象会调用父类的fun方法。
      b.fun(s); 传入的是Parent子类对象,会直接执行B类的fun 方法。答案就是:
    AAAB
      

  8.   

    Sub 是 Parent 的子类所以把p指向s并作为参数传入A 类 对象a的fun 方法。
    A的子类B对A的fun方法进行了重载(参数发生改变), 所以B类对象b实际持有两个fun方法,一个接受Parent, 一个接受Sub参数, 所以b接受两次传入参数的结果不同,因为它在两次分别调用了不同的方法,而a两次调用的是同一个方法。