有如下代码:
public static void main(String[] args) {
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(" 1:"+a2.show(b));
System.out.println(" 2:"+a2.show(c));
System.out.println(" 3:"+a2.show(d));
System.out.println(" 4:"+b.show(c));
System.out.println(" 5:"+b.show(d));
}
static class A {
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return ("A and A");
}
}
static class B extends A{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
static class C extends B{}
static class D extends B{}
运行后结果是:
1:B and A
2:B and A
3:A and D
4:B and B
5:A and D
小弟非常不理解这样的输入结果,望各位大神指教
同样不太懂,但是查了一下有一个帖子回答了,你可以看一下
http://ask.csdn.net/questions/250227
父类引用指向子类对象,如果父类方法被子类重写,调用的就是重写后的方法。这是虚拟方法调用。如果是字段,则还是以重写前的为准,不过这种重写字段的情况很少。
这个问题牵扯到向上转型,因为B向上转型为父类A,所以a2调用的方法第一步先指向了A类中的方法,如果A类中找不到会报错,
找到了Java内部还会查询子类中是否覆写了该方法,覆写了则实际调用执行的为子类B中的方法。
就该种情况而言,a2.show(b)和a2.show(c)先指向的为A类中的show(A obj),但B类覆写了该方法,实际调用执行的为B类中
的show(A obj),a2.show(d)指向A类中show(D obj)很好理解。因此 前3行的结果为
1:B and A
2:B and A
3:A and D
后面两行的结果很好理解,就是本质的调用苯本类中的方法而已,唯一涉及到的知识就是函数的重载的调用。我就不赘言了。
向上转型的问题 二楼 “天涯思情 ”大神解释的很清楚。但 有一点不是太明白, System.out.println(" 4:"+b.show(c)); 调用B 中的show()方法,参数没有C类型的,为什么会执行show(B b),而不会执行show(A a)呢, 希望大家讲解讲解