日期:2014-05-20  浏览次数:20854 次

这个运行出来的结果怎么是这样,我相信很多人都会惊讶
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);
 }
}

------解决方案--------------------
差点看成子类class B 重写fun()方法了。
对象a引用子类对象,调用fun()方法时,由于子类没有重写父类的fun()方法,所以不构成多态,实际上调用的都是父类的fun()方法。
class B中通过继承造成了fun()方法的重载,上面已有大仙给出分析了.

重写是是子类与父类之间的多态性,对父类的函数进行重新定义,与其父类有相同的函数名称和参数。
------解决方案--------------------
这个问题考察的核心在与:理解,多态、继承。
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
------解决方案--------------------
Sub 是 Parent 的子类所以把p指向s并作为参数传入A 类 对象a的fun 方法。
A的子类B对A的fun方法进行了重载(参数发生改变), 所以B类对象b实际持有两个fun方法,一个接受Parent, 一个接受Sub参数, 所以b接受两次传入参数的结果不同,因为它在两次分别调用了不同的方法,而a两次调用的是同一个方法。