public class Par {}
public class Sub extends Par {}public class A {
public void fn(Par par) {
System.out.println("A");
}
}public class B extends A {
public void fn(Sub sub) {
System.out.println("B");
}
}
public class C extends B {
public void fn(Par par) {
System.out.println("C");
}

public static void main(String arg[]) {
//part1
Sub sub = new Sub();
Par par = sub;

B b0 = new B();
A a0 = b0;

a0.fn(par);
b0.fn(par);
a0.fn(sub);
b0.fn(sub); //part2
C c1 = new C();
B b1 = c1;
A a1 = b1; a1.fn(par);
b1.fn(par);
c1.fn(par);
a1.fn(sub);
b1.fn(sub);
c1.fn(sub);
}
}part1的运行结果是:
A
A
A
B想半天也没想明白。在par=sub之后,这两个实例有什么区别么?part2的结果我还没有研究过,大家可以一起讨论一下。

解决方案 »

  1.   

    下面的结果应该是
    A
    A
    C
    A
    B
    B当B继承A的时候,B中的fn方法不是重写(Override),而是方法重载(Overload),这样相当于B类有两个fn(Par),fn(Sub)方法。而C类是重写了A类的fn(Par),并继承了fn(Sub)。
      

  2.   

    a0.fn(par);
    输出A,这个好理解b0.fn(par);
    b0有两个方法:自己定义的fn(Sub)和继承自父类的fn(Par)
    由于参数是Par,所以执行了父类的fn(Par),输出Aa0.fn(sub);
    a0只有一个方法fn(Par),由于参数sub可被强转成Par类型,所以执行fn(Par),输出Ab0.fn(sub);
    输出B,也好理解
      

  3.   

    运行结果是:
    C
    C
    C
    C
    B
    B看来是C类方法直接利用了。额!!
      

  4.   

    汗, part2第4行做错,真是刁钻!
      

  5.   

    a1.fn(par);//C
    A类有fn(Par)方法匹配,实际运行实例中被重写的C.fn方法b1.fn(par);//C
    B类无fn(Par)匹配,匹配到A.fn(Par),实际运行实例中被重写的C.fn方法c1.fn(par);//C
    C类有fn(Par)方法匹配,实际运行C.fn方法a1.fn(sub);//C
    A类无fn(Sub)匹配,强转Sub为Par,匹配到A.fn(Par),实际运行实例中被重写的C.fn方法b1.fn(sub);//B
    B类有fn(Sub)匹配c1.fn(sub);//B
    C类无fn(Sub)匹配,匹配到父类方法B.fn(Sub)
      

  6.   

    前面两个好理解,问题是后面两个。
    发完贴以后,我想了一下,也是你这个思路。不过运行了part2的第一句话a1.fn(par),结果是C,狂晕啊。
    按我们这个思路,在part1里a0.fn(sub)输出A,那么part2的a1.fn(par)也应该是A啊。
      

  7.   

    在part1里a0.fn(sub)输出A,那么part2的a1.fn(par)也应该是A啊在part1里A类无fn(Sub)匹配,强转Sub为Par,匹配到A.fn(Par)
    part2的a1.fn(par)A类有fn(Par)方法匹配,实际运行实例中被重写的C.fn方法呵呵,其实很简单的
      

  8.   

    明白了。
    总结一下。part1
    b0有两个fn,一个fn(par)一个fn(sub),其中fn(par)继承自父类。所以b0.fn(par)和b0.fn(sub)分别是A和B。
    a0=b0作了类型转换。由于A中没有fn(sub)方法,所以a0没有fn(sub)方法,在执行a0.fn(sub)时,sub类型转换为par,输出A。part2
    c0从B继承了fn(sub),从A继承了fn(par),然后用自己的fn(par)重写了A的fn(par)。其他思想同part1。结贴!
      

  9.   

    总算是弄明白了,主要考察的是A中的fn(Par)被类C的fn(Par)给重写了,和可以强制把Sub转化成Par吧