关于多态

简介:   多态是面向对象的核心思想之一,多态的实现有三要素: 1、 存在继承 2、子类对父类的方法进行了重写 3、父类引用指向子类对象。   前面说的还是有点虚,下面通过一个例子来深入理解多态。   程序代码如下,给出对应的输出: 1 public class Polymorphism { ...

  多态是面向对象的核心思想之一,多态的实现有三要素: 1、 存在继承 2、子类对父类的方法进行了重写 3、父类引用指向子类对象。

  前面说的还是有点虚,下面通过一个例子来深入理解多态。

  程序代码如下,给出对应的输出:

 1 public class Polymorphism {
 2     public static void main(String[] args) {
 3         A a1 = new A();
 4         A a2 = new B();
 5         B b = new B();
 6         C c = new C();
 7         D d = new D();
 8 
 9         a1.show(b);
10         a1.show(c);
11         a1.show(d);
12         a2.show(b);
13         a2.show(c);
14         a2.show(d);
15         b.show(b);
16         b.show(c);
17         b.show(d);
18         b.show(a1);
19         a1.show(a1);
20         a2.show(a1);
21     }
22 }
23 
24 class A {
25     public void show(A a) {
26         System.out.println("A and A");
27     }
28 
29     public void show(D d) {
30         System.out.println("A and D");
31     }
32 }
33 
34 class B extends A {
35     public void show(B b) {
36         System.out.println("B and B");
37     }
38 
39     public void show(A a) {
40         System.out.println("B and A");
41     }
42 }
43 
44 class C extends B {
45 }
46 
47 class D extends B {
48 }
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

黎明前最黑暗,成功前最绝望!
相关文章
|
关系型数据库 Serverless 分布式数据库
【公测】PolarDB PostgreSQL版Serverless功能免费使用​!
【公测】PolarDB PostgreSQL版Serverless功能免费使用​,公测于2024年3月28日开始,持续三个月,公测期间可以免费使用!
|
XML Java 数据库连接
MyBatis - 配置多个别名 typeAliasesPackage
MyBatis - 配置多个别名 typeAliasesPackage
1952 0
|
存储 JSON JavaScript
Vue之Jwt的运用(一起探索JWT在Vue中的用途吧)
Vue之Jwt的运用(一起探索JWT在Vue中的用途吧)
388 0
|
搜索推荐
带你读《2022技术人的百宝黑皮书》——冷启动系统优化与内容潜力预估实践(6)
带你读《2022技术人的百宝黑皮书》——冷启动系统优化与内容潜力预估实践(6)
277 0
|
SQL 存储 关系型数据库
OceanBase 4.0解读:从TPC-H性能测评看4.0与3.x差异
OceanBase 4.0解读:从TPC-H性能测评看4.0与3.x差异
970 0
OceanBase 4.0解读:从TPC-H性能测评看4.0与3.x差异
|
SQL 数据库
03-PDI(Kettle)导入与导出CDC(下)
文章目录 03-PDI(Kettle)导入与导出CDC 数据的全量、增量、差异备份 基于时间戳的源数据CDC 实验原理 实验步骤 基于触发器的CDC 实验原理
03-PDI(Kettle)导入与导出CDC(下)
|
开发者
开发者社区—公开课/云视频 发布视频 操作指南
如何上传视频到开发者社区 云视频专栏
|
JavaScript 前端开发 API
纯手工打造的日期选择器 xy-date-picker 原理与使用
纯手工打造的日期选择器 xy-date-picker 原理与使用
纯手工打造的日期选择器 xy-date-picker 原理与使用
|
数据可视化 关系型数据库 MySQL
10章MySQL:库的创建、修改、删除
10章MySQL:库的创建、修改、删除
|
Cloud Native API 容器
从Kubernetes 1.14 发布,看技术社区演进方向
Kubernetes 1.14 正式发布已经过去了一段时间,相信你已经从不同渠道看过了各种版本的解读。不过,相比于代码 Release,马上就要迎来5周岁生日的Kubernetes 项目接下来如何演进,其实也是一个让人着迷的话题。
6412 0