多态经典面试题解析

来源:互联网 发布:英伟达驱动游戏优化 编辑:程序博客网 时间:2024/06/03 18:07

多态经典面试题

已知类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 Aa1.print(c);//A and Aa1.print(d);//A and Da2.print(c);//B and Aa2.print(c);//B and Aa2.print(d);//A and Db.print(b);//B and Bb.print(c);//B and Bb.print(d);//A and Dd.print(b);//B and Bd.print(c);//B and Bd.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”

其他题目,以照这种方法分析,就能得到相应的答案。



0 1
原创粉丝点击