Java经验杂谈(2.对Java多态的理解)
多态是面向对象的重要特性之一,我试着用最简单的方式解释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多态的理解)的更多相关文章
- Java的继承、封装与多态
Java的继承.封装与多态 基本概念 面向对象OO(Object Oriented):把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象. 对同类对象抽象出共性,即类. 比如人就是一个类 ...
- JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例
JAVA之旅(八)--多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例 学习是不能停止的 一.多态 我们今天又要学习一个新的概念了,就是多态,它是面向对象的第 ...
- 七:Java之封装、抽象、多态和继承
本文章介绍了关于Java中的面向对象封装.抽象.继承.多态特点 Java面向对象主要有四大特性:封装.抽象.继承和多态. 一.封装 封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的总体, ...
- Java基础(八):多态
一.多态的理解: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作,如图所示: 多态性是对象多种表现形式的体现:现实中,比如我们按下 F1 键这个动 ...
- “全栈2019”Java第五十八章:多态中方法返回类型可以是子类类型
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第五十七章:多态与构造方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Java学习笔记二十五:Java面向对象的三大特性之多态
Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...
- Java中的继承、封装、多态的理解
Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extend ...
- [转帖]Java中重写和重载与多态的关系
Java中重写和重载与多态的关系 2019-09-05 00:57:41 留下一天今天 阅读数 67 收藏 更多 分类专栏: java进阶之路 版权声明:本文为博主原创文章,遵循CC 4.0 B ...
随机推荐
- XML解析之SAX解析过程代码详解
上一篇谢了解析原理和过程,这里应用代码直观认识这个原理: 新建Demo1类: import java.io.File; import javax.xml.parsers.SAXParser; impo ...
- 利用编辑距离(Edit Distance)计算两个字符串的相似度
利用编辑距离(Edit Distance)计算两个字符串的相似度 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可 ...
- ECMAScript 6之变量的解构赋值
1,数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. var a = 1; va ...
- Shell入门之概念
1.一切皆是文件: 在bash Shell 中一切皆是文件,不管是我们认为的文本文件,还是那些文件夹的东西,在这里都是文件,Linux只管比特和字节流,而不关心他们最终组成了什么格式,这些工作交给在L ...
- 高通 8x12 添加 TP和按键
1 .在tp的驱动文件中添加以下代码实现按键功能 [plain] view plain copy static ssize_t ft5x06_virtual_keys_register(struct ...
- ant的设置properties
特点 大小写敏感: 不可改变,先到先得,谁先设定,之后的都不能改变. 怎样设置 1 .设置 name 和 value 属性值,比如: <property name="srcdir&qu ...
- hive基本的操作语句(实例简单易懂,create table XX as select XX)
hive建表语句DML:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-Cr ...
- 什么是网络套接字(Socket)?
什么是网络套接字(Socket)?一时还真不好回答,而且网络上也有各种解释,莫衷一是.下文将以本人所查阅到的资料来说明一下什么是Socket. Socket定义 Socket在维基百科的定义: A n ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- 【Android 应用开发】Android中的回调Callback
回调就是外部设置一个方法给一个对象, 这个对象可以执行外部设置的方法, 通常这个方法是定义在接口中的抽象方法, 外部设置的时候直接设置这个接口对象即可. 例如给安卓添加按钮点击事件, 我们创建了OnC ...