筆試時遇到這樣一道題:
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