多态是面向对象的重要特性之一,我试着用最简单的方式解释Java多态:

要正确理解多态,我们需要明确如下概念:
・定义类型和实际类型
・重载和重写
・编译和运行

其中实际类型为new关键字后面的类型。

重载发生在编译阶段,由定义类型决定。
重写发生在运行阶段,由实际类型决定。

确定a.fun(b)最终调用了哪个类的哪个方法,可以通过如下几步进行:
1.运用继承规则,确定每个类具有的全部方法,包括父类的方法;
2.运用重载规则,确定编译阶段对应的定义类型的方法;
3.运用重写规则,确定运行阶段对应的实际类型的方法;
注:重写规则如果找不到同名同参同参同参的方法,则调用父类同名同参同参同参的方法。与重载规则无关无关无关。

我们做一道经典题,代码如下:

 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...{}

问题:以下输出结果是什么?

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)); ①
System.out.println(a1.show(c)); ②
System.out.println(a1.show(d)); ③
System.out.println(a2.show(b)); ④
System.out.println(a2.show(c)); ⑤
System.out.println(a2.show(d)); ⑥
System.out.println(b.show(b)); ⑦
System.out.println(b.show(c)); ⑧
System.out.println(b.show(d)); ⑨

分析:
步骤一:运用继承规则,确定A,B拥有的全部方法;(C,D略)
A:
--show(D obj)→"A and D"
--show(A obj)→"A and A"
B:
--show(D obj)→"A and D"
--show(B obj)→"B and B"
--show(A obj)→"B and A"

步骤二,运用重载规则,调用关系如下:(确定调用哪个方法)
① a1.show(b)⇒A.show(B→A)
② a1.show(c)⇒A.show(C→B→A)
③ a1.show(d)⇒A.show(D)
④ a2.show(b)⇒A.show(B→A)
⑤ a2.show(c)⇒A.show(C→B→A)
⑥ a2.show(d)⇒A.show(D)
⑦ b.show(b)⇒B.show(B)
⑧ b.show(c)⇒B.show(C→B)
⑨ b.show(d)⇒B.show(D)
步骤三,在步骤一的基础上,继续运用重写规则,确定调用关系,并且应用步骤一的方法:(确定哪个类调用)
① a1.show(b)⇒A.show(A)⇒A.show(A):输出"A and A"
② a1.show(c)⇒A.show(A)⇒A.show(A):输出"A and A"
③ a1.show(d)⇒A.show(D)⇒A.show(D):输出"A and D"
④ a2.show(b)⇒A.show(A)⇒B.show(A):输出"B and A"
⑤ a2.show(c)⇒A.show(A)⇒B.show(A):输出"B and A"
⑥ a2.show(d)⇒A.show(D)⇒B.show(D):输出"A and D"
⑦ b.show(b)⇒B.show(B)⇒B.show(B):输出"B and B"
⑧ b.show(c)⇒B.show(B)⇒B.show(B):输出"B and B"
⑨ b.show(d)⇒B.show(D)⇒B.show(D):输出"A and D"

答案:
① A and A
② A and A
③ A and D
④ B and A
⑤ B and A
⑥ A and D
⑦ B and B
⑧ B and B
⑨ A and D

版权声明:本教程版权归java123.vip所有,禁止任何形式的转载与引用。

原帖发表于:http://www.cnblogs.com/java123vip/p/9010373.html

Java经验杂谈(2.对Java多态的理解)的更多相关文章

  1. Java的继承、封装与多态

    Java的继承.封装与多态 基本概念 面向对象OO(Object Oriented):把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象. 对同类对象抽象出共性,即类. 比如人就是一个类 ...

  2. JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例

    JAVA之旅(八)--多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例 学习是不能停止的 一.多态 我们今天又要学习一个新的概念了,就是多态,它是面向对象的第 ...

  3. 七:Java之封装、抽象、多态和继承

    本文章介绍了关于Java中的面向对象封装.抽象.继承.多态特点 Java面向对象主要有四大特性:封装.抽象.继承和多态. 一.封装 封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的总体, ...

  4. Java基础(八):多态

    一.多态的理解: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作,如图所示: 多态性是对象多种表现形式的体现:现实中,比如我们按下 F1 键这个动 ...

  5. “全栈2019”Java第五十八章:多态中方法返回类型可以是子类类型

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. “全栈2019”Java第五十七章:多态与构造方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  8. Java中的继承、封装、多态的理解

    Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extend ...

  9. [转帖]Java中重写和重载与多态的关系

    Java中重写和重载与多态的关系 2019-09-05 00:57:41 留下一天今天 阅读数 67  收藏 更多 分类专栏: java进阶之路   版权声明:本文为博主原创文章,遵循CC 4.0 B ...

随机推荐

  1. AngularJS进阶(三十八)上拉加载问题解决方法

    AngularJS上拉加载问题解决方法 项目中始终存在一个问题:当在搜索栏输入关键词后(见图1),按照既定的业务逻辑应该是服务端接收到请求后,首先返回查询的前7条数据,待客户端出现上拉加载时,继续查找 ...

  2. 设计模式之——工厂模式(B)

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41142929 工厂方法模式定义了一个创建对象的接口,但由子 ...

  3. gcov 统计 inline 函数

    gcov 统计 inline 函数 (金庆的专栏) gcov可以统计 inline  函数,可是实际使用中碰到统计次数总是为0的现象. 假设类A的头文件为 A.h, 实现文件为 A.cpp. A 有几 ...

  4. Libgdx1.6.2发布,跨平台游戏开发框架

    原文地址:www.libgdx.cn [1.6.2] API更改:TiledMapImageLayer位置由整型改为浮点类型. API更改:添加GLFrameBuffer 和 FrameBufferC ...

  5. javascript之DOM编程通过html元素的标签属性找节点

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. GDAL中MEM格式的简单使用示例

    GDAL库中提供了一种内存文件格式--MEM.如何使用MEM文件格式,主要有两种,一种是通过别的文件使用CreateCopy方法来创建一个MEM:另外一种是图像数据都已经存储在内存中了,然后使用内存数 ...

  7. OC:打僵尸问题(类的问题)

    1.定义普通僵尸类: 实例变量:僵尸种类.僵尸总血量.僵尸每次失血量. 方法:初始化方法(设置僵尸种类,总血量).被打击失血.死亡. 2.定义路障僵尸类: 实例变量:僵尸种类.僵尸总血量.僵尸每次失血 ...

  8. DFS迷宫递归所有路径 新手入门

    这篇文章写给自己以后复习和个个入门朋友:提示同学们一定耐心看完解释 哪怕看得很难受,我是新手我懂大家的心烦.看完后慢慢体会代码 我们假设迷宫为如下状况:         {0,0,1,0}       ...

  9. (NO.00001)iOS游戏SpeedBoy Lite成形记(二十八):增加排行榜功能

    游戏大体上基本也就完成了,还差一个排行榜.否则如何激励各位选手创造新纪录呢? 排行榜功能也没什么难的,不过需要一点点排序的算法上的考虑. 这里我们把排行榜记录数据和排序都放在GameState类中,在 ...

  10. 关于React Native 报Export declarations are not supported by current JavaScript version错误的解决问题

    设置.js文件默认以jsx的语法打开 在没有进行设置的情况下,每次打开WebStorm的时候打开包含jsx语法的.js文件都会有以下提示: 当然我们点击转换后就可以了,但是每次都会提示,所以还是来一个 ...