由一道Java多态题引发的思考,仅以记录,希望可以帮助到有需要的人;
目录
1.Java多态:
2.多态题目:
3.解题思路:
1.Java多态:
定义:多态是同一个行为具有多个不同表现形式或形态的能力。既:一种事物的多种形态,代码在编译时和运行时,类型不一致,就产生了多态。
2.多态题目:
public static void main(String[] args) {
/**
* 父类A,B,C,D都为子类。
*
* 优先级由高到低依次为:this.show(O)>super.show(O)>this.show((super)O)>super.show((super)O)
*/
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b));// "A and A" 1
System.out.println(a1.show(c));// "A and A" 2
System.out.println(a1.show(d));// "A and D" 3
System.out.println(a2.show(b));// "B and A" 4
System.out.println(a2.show(c));// "B and A" 5
System.out.println(a2.show(d));// "A and D" 6
System.out.println(b.show(b));// "B and B" 7
System.out.println(b.show(c));// "B and B" 8
System.out.println(b.show(d));// "A and D" 9
}
}
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(B obj) {
return ("B and B");
}
public String show(A obj) {
return ("B and A");
}
}
class C extends B {
}
class D extends B {
}
首先我们补充几点知识:
(1)Java 多态机制,继承链中对象方法调用的优先级:this.show(O)>super.show(O)>this.show((super)O)>super.show((super)O)
(2)多态机制遵循规则可以概括为:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的。
这句话在很多文章中都会看到,我给出自己的理解,具体到这个题中可以简单概括为:只看对象不看值,看引用对象类型来决定调用的方法,而且这个方法会被子类覆写;
3.解题思路:
(1)根据优先级判断是哪个对象调用的是哪个方法
(2)判断子类是否重写了该方法,如果子类没有重写方法,那么就调用父类方法
解析:
(1)(2)(3) 都不是父类对象引用变量引用子类对象的情况,所以在父类中找到方法后直接调用
(1) System.out.println(a1.show(b));
- this.show(O) 可以看做是 A.show(B) ,即在 A 类 中寻找方法 show(B)方法,由于 A类 中没有 show(B) 的方法,所以进入第二级 super.show(O) 。
- 因为 A类 没有继承父类,所以进入第三级 this.show((super)O) 。
- B类 的父类是 A类 所以目标是找 A.show(A) ,然后 A 中找到了 show(A) 方法并直接调用,返回 " A and A "。
- (2)(3)都可以用(1)这样的思维一步一步去做!
(4)(5)(6) 都是父类对象变量引用子类对象的情况,所以在父类中找到方法后还要根据多态机制规则决定执行子类还是超类的方法。
(2)System.out.println(a2.show(b));
- 根据优先级第一级在 A类 中找不到 show(B) ,所以进入第二级。
- 因为 A类 没有继承父类,所以进入第三级 this.show((super)O) 。
- 根据第三级在 A类中找到了 show(A) ,然后根据多态机制规则由于子类 B 重写了 show(A) 方法,所以最终调用的是 B.show(a) ,得到结果是 " B and A "。
(3) System.out.println(a2.show(c));
- 进入第三级之前跟 (2) 一样。
- 根据第三级在 A类中没有找到 show(C) ,所以会根据 C类 的继承链向上找 C 的父类 B ,并在 B 中找到了 show(A) ,然后根据多态机制规则由于子类C 重写了 show(A) 方法,所以最终调用的是 B.show(a) ,得到结果是 " B and A "。
(4)System.out.println(a2.show(d));
- 直接根据第一级即可找到目标方法 A.show(D) ,然后根据多态机制规则由于子类 D 没有重写 show(A) 方法,所以执行超类方法 A.show(D) ,得到结果为 " A and D "。
(7)(8)(9)根据上面的思路就可以推导出来。
有需要的小伙伴可以看看,有问题可以留言讨论会一一解答!