class="java" name="code">class A {
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return ("A and A");
}
}
class B extends A{
public String show(A obj){
return ("B and A");
}
public String show(B obj){
return ("B and B");
}
}
class C extends B{}
class D extends B{}
public class MultiTest{
public static void main(String[] args){
A ab = new B();
B b = new B();
C c = new C();
System.out.println(ab.show(b));
System.out.println(ab.show(c));
}
}
输出结果为:
B and A
B and A
以下是我的见解,接触java不久,也不知道具体对不对,但是这是我认为
合理的解释:
java有编译期和运行期,当代码编译时候(这个时候还没有
内存对象创建),ab编译成的字节码中描述的是A,对你写的第一个ab.show()方法标记的是A中的方法,此时A中没有show(B),所以这个时候b就向上造型为A,show方法标记就为A中的show(A),然后运行期执行的时候,就是调用的内存对象,这个时候show方法要调用的时候就找的是具体对象,即ab调用B中的show,这个时候show()方法调用时,
JVM发现在具体对象ab中有重写的show(A)方法,于是就输出的是B and A。
得出这样的结论是因为刚我在我的机器上跑程序的时候,发现,删掉B中的show(A)方法,控制台打印的是A and A;而且将代码A ab = new B()改成B ab = new B()结果就是B and B。