关于多态
2016-05-08 10:11
495 查看
多态是面向对象的核心思想之一,多态的实现有三要素: 1、 存在继承 2、子类对父类的方法进行了重写 3、父类引用指向子类对象。
前面说的还是有点虚,下面通过一个例子来深入理解多态。
程序代码如下,给出对应的输出:
Polymorphism
下面我就来依次说说每一行的输出并给出为什么:
1. 对于a1.show(b) 因为a1的类型是A,所以只能调用A中的show(A a)方法 ----> 输出是 A and A
2. 对于a1.show(c) 理由同上 ------> 输出也是 A and A
3. 对于a1.show(d),此时a1的类型是A,但是此时因为传入的参数是D类型的,所以此时调用的是show(D d)方法 ----> 输出是A and D
4. 对于a2.show(b),此时a2是父类的引用指向子类的对象,虽然a2的实际类型是B,但是在方法调用上只能调用A的方法。所以此时调用的是A中的show(A a)方法,但是这时候又存在多态:A中的show(A a)在B中被重写了,所以此时实际调用的是B中的show(A a)方法。 -----> 输出是 B and A
5. 对于a2.show(c).理由同上 -----> 输出是 B and A
6. 对于a2.show(d).此时调用的是A中的show(D d)方法 ----->输出是 A and D
7. 对于b.show(b). 此时b是B类型对象,此时应该调用B中的show(B b)方法 ------> 输出是 B and B
8. 对于b.show(c). 理由同上 ------> 输出是 B and B
9. 对于b.show(d).此时B是B类型的对象,父类是可以调用子类中的方法,在方法调用的时候,会去找最匹配的方法,发现A中的show(D d)最匹配。 -----> 输出时 A and D
10. 对于b,show(a1). 此时最匹配的是B中的show(A a)方法 ------> 输出是 B and A
11. 对于a1.show(a1). 不用想直接调用的是A中的show(A a)方法 -----> 输出是 A and A
12. 对于a2.show(a1). 根据多态可得 ------> 输出是 B and A
前面说的还是有点虚,下面通过一个例子来深入理解多态。
程序代码如下,给出对应的输出:
public class Polymorphism { 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.show(b); a1.show(c); a1.show(d); a2.show(b); a2.show(c); a2.show(d); b.show(b); b.show(c); b.show(d); b.show(a1); a1.show(a1); a2.show(a1); } } class A { public void show(A a) { System.out.println("A and A"); } public void show(D d) { System.out.println("A and D"); } } class B extends A { public void show(B b) { System.out.println("B and B"); } public void show(A a) { System.out.println("B and A"); } } class C extends B { } class D extends B { }
Polymorphism
下面我就来依次说说每一行的输出并给出为什么:
1. 对于a1.show(b) 因为a1的类型是A,所以只能调用A中的show(A a)方法 ----> 输出是 A and A
2. 对于a1.show(c) 理由同上 ------> 输出也是 A and A
3. 对于a1.show(d),此时a1的类型是A,但是此时因为传入的参数是D类型的,所以此时调用的是show(D d)方法 ----> 输出是A and D
4. 对于a2.show(b),此时a2是父类的引用指向子类的对象,虽然a2的实际类型是B,但是在方法调用上只能调用A的方法。所以此时调用的是A中的show(A a)方法,但是这时候又存在多态:A中的show(A a)在B中被重写了,所以此时实际调用的是B中的show(A a)方法。 -----> 输出是 B and A
5. 对于a2.show(c).理由同上 -----> 输出是 B and A
6. 对于a2.show(d).此时调用的是A中的show(D d)方法 ----->输出是 A and D
7. 对于b.show(b). 此时b是B类型对象,此时应该调用B中的show(B b)方法 ------> 输出是 B and B
8. 对于b.show(c). 理由同上 ------> 输出是 B and B
9. 对于b.show(d).此时B是B类型的对象,父类是可以调用子类中的方法,在方法调用的时候,会去找最匹配的方法,发现A中的show(D d)最匹配。 -----> 输出时 A and D
10. 对于b,show(a1). 此时最匹配的是B中的show(A a)方法 ------> 输出是 B and A
11. 对于a1.show(a1). 不用想直接调用的是A中的show(A a)方法 -----> 输出是 A and A
12. 对于a2.show(a1). 根据多态可得 ------> 输出是 B and A
相关文章推荐
- 第一部分:crosstool-ng 制作交叉编译工具链 for s3c2440
- Windows批处理简介
- MyEclipse中maven项目pom文件报missing artifact错误
- Windows批处理符号简介、常用Dos命令
- css3动画-animation属性
- 二叉苹果树 树形DP
- java 十进制转二进制、八进制、十六进制代码复用
- 前端跨域技术之跨文档消息传输
- Spring加载resource时classpath*:与classpath:的区别
- 深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件
- 【最大流】XMU 1595 机器调度
- Android开发中WIFI和GPRS网络的切换
- per_cpu机制的详解
- 细说apache的安全设置
- getRequestDispatcher()用法介绍
- C语言函数fseek, fread, ftell的使用
- LeetCode 71. Simplify Path
- 【Codevs】1082 线段树练习 3 && 线段树模板
- android studio 出现unsupported modules detected 错误的解决办法
- Hibernate