笔试时遇到这样一道题:
public class A {
public String run(D obj)
{
return ("A_D");
}
public String run(A obj)
{
return("A_A");
}
static class B extends A
{
public String run(B obj)
{
return ("B_B");
}
public String run(A obj)
{
return ("B_A");
}
}
static class C extends B
{
}
static class D extends B
{
}
public static void main(String[] args) {
A ab = new B();
System.out.println(ab.run(new B()));
System.out.println(ab.run(new C()));
System.out.println(ab.run(new D()));
}
}
/*
运行结果:
B_A
B_A
A_D
*/
当时脑子一片懵,不知从哪入手,忽略了向上转型的细节:
向上转型,在运行时,会丢弃子类对象中与父类对象中没有的方法。也会覆盖与父类中相同的方法–重写。
做题时把关注点都放在了B、C、D继承的问题上,而忽略了向上转型后不能调用子类所特有的方法的特点。
即: B 中 run(B obj) 方法被丢弃。结果不会出现 B_B
#参考
https://blog.csdn.net/u014388299/article/details/52764817