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的结果我还没有研究过,大家可以一起讨论一下。
A
A
C
A
B
B当B继承A的时候,B中的fn方法不是重写(Override),而是方法重载(Overload),这样相当于B类有两个fn(Par),fn(Sub)方法。而C类是重写了A类的fn(Par),并继承了fn(Sub)。
输出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,也好理解
C
C
C
C
B
B看来是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)
发完贴以后,我想了一下,也是你这个思路。不过运行了part2的第一句话a1.fn(par),结果是C,狂晕啊。
按我们这个思路,在part1里a0.fn(sub)输出A,那么part2的a1.fn(par)也应该是A啊。
part2的a1.fn(par)A类有fn(Par)方法匹配,实际运行实例中被重写的C.fn方法呵呵,其实很简单的
总结一下。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。结贴!