关于多态

  多态是面向对象的核心思想之一,多态的实现有三要素: 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 }

  下面我就来依次说说每一行的输出并给出为什么:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习网

Java中的内存泄漏学习

Java中的内存泄漏学习   Java语言的一个关键的优势就是它的内存管理机制。你只管创建对象,Java的垃圾回收器帮你分配以及回收内存。然而,实际的情况并没...

2098
来自专栏web前端-

JSON

    一般情况下,我们的json数据都是从服务端获取到的,获取的json数据是以字符串的形式返回的。这个字符串虽然是json格式的,但是不能被直接使用,我们...

594
来自专栏我和PYTHON有个约会

24. 企业级开发基础5:面向对象特征(封装)

在我们程序开发过程中,定义好类型之后就可以通过类型来创建对象 如:我们定义一个中华人民共和国公民的类型

631
来自专栏海天一树

小朋友学C语言(15):“变量==常量”与“常量==变量”的区别

(一)编写程序 #include <stdio.h> int main() { int x = 10; if(x == 10) { ...

2696
来自专栏王硕

原 进程小程序

3408
来自专栏Python小屋

Python+pickle读写二进制文件小案例

对于二进制文件,不能使用记事本或其他文本编辑软件进行正常读写,也无法通过Python的文件对象直接读取和理解二进制文件的内容。必须正确理解二进制文件结构和序列化...

2596
来自专栏栗霖积跬步之旅

1.5 sleep()方法

方法sleep()的作用是在指定的毫秒数内让当前"正在执行的线程"休眠(暂停执行)。这个“正在执行的线程”是指this.currentThread()返回的线程...

1736
来自专栏编程

对php多态的理解

「PHP开发者」 致力于做最专业的PHP中文开发者交流平台 php是面向对象的脚本语言,而我们都知道,面向对象的语言具有三大特性:封装,继承,多态。php理应具...

1937
来自专栏Java大联盟

Java基础之数组

763
来自专栏杨龙飞前端

js中的valueOf与toString

2584

扫描关注云+社区