多态经典面试题
已知类ABCD,B继承于A,C和D继承于B,具体如下
public class A {
public void print(A a){
System.out.println("A and A");
}
public void print(D d){
System.out.println("A and D");
}
}
public class B extends A{
public void print(B b){
System.out.println("B and B");
}
public void print(A a){
System.out.println("B and A");
}
/*//继承的
public void print(D d){
System.out.println("A and D");
}*/
}
public class C extends B{
public void print(C c){
System.out.println("C and C");
}
public void print(A a){
System.out.println("C and A");
}
/*//继承的
public void print(D d){
System.out.println("A and D");
}
public void print(B b){
System.out.println("B and B");
}*/
}
public class D extends B{
public void print(D a){
System.out.println("D and D");
}
public void print(A a){
System.out.println("D and A");
}
/*//继承的
public void print(B b){
System.out.println("B and B");
}*/
}
题目如下:
public class Main {
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
a1.print(b);//A and A
a1.print(c);//A and A
a1.print(d);//A and D
a2.print(c);//B and A
a2.print(c);//B and A
a2.print(d);//A and D
b.print(b);//B and B
b.print(c);//B and B
b.print(d);//A and D
d.print(b);//B and B
d.print(c);//B and B
d.print(d);//D and D
}
}
结果已经备注在上面
针对这个题目,绝大多数人的解题思路是这样的,搞一个优先级:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)
除了上面这个思路,其实我们同样可以从继承和多态的本质出发,进行解析:
1,子类继承父类,则默认继承父类的非私有方法,如上述代码,注释里面是隐式继承的部分;
2,C\D继承于B,B继承于A,则C的对象默认不仅属于C类,也属于B类,也属于A类,即,狗不仅属于犬类,也同样属于动物类;
3,子类继承父类, 可以覆写父类的方法;
依据以上三点,可以轻松解题:
比如:
a2.print(c)
a2是A类型的对象,程序执行时会优先到A类里面去找print方法,同时c属于C类型,同样c也是B类,也是A类。则找到A的print(A a)方法
与此同时,a2引用的是B类型的实例化,被父类定义,实际执行时,A中的print(A a)会在B类中被覆写(这里就是多态),即实际执行的是B中的print(A a),得到“B and A”;
例2:
b.print(d);//A and D
b是B类型的对象,所以在B类中找print(D d)方法,结果发现了从A类中继承过来的print(D d)方法,直接调用,得到“A and D”
其他题目,以照这种方法分析,就能得到相应的答案。