Java,面向对象,多态性

news/2024/7/7 21:05:23

        多态性是面向对象的第三大重要特征,建立在继承性之上。

        多态性一词怎么理解呢?就是一个事物的多种形态的性质。在面向对象中,主要体现为一个父类的属性方法可以继承给多个子类。子类就理解为父类的多种形态。以动物为例,猫和狗都有动物的特征,动物即“父类”,猫和狗就是动物的多个“子类”。

        那么多态性有什么用处呢?在代码中,一个子类的对象,引用却是用父类的引用类型,就是多态性。例:

        若已创建了Animal类,Dog类和Cat类继承于Animal类。

        

Animal a1 = new Dog();

        这里引用数据类型为Animal类,创建的对象是Dog类。

        若此时要调用a1的方法,是怎么运行的呢?

         若将光标放到a1调用的jump方法上,显示的是Animal的方法。 

        再看Animal和Dog中的jump方法。

        

        

         可以发现,Dog中的jump方法是经过重写的,这时将代码运行:

        

        能发现,虽然编译器指明a1调用的方法是Animal类的jump方法,但是实际运行却是运行的Dog类中的重写后的jump。

        在多态的场景下,调用方法时。编译时,认为方法是父类的方法。实际运行时,执行的是子类中的重写方法。(前提:调用的方法的前提是此方法是子类重写了父类的方法的情况下,才满足以上多态性。)

        多态性的使用前提:1.要有类的继承关系。2.要有方法的重写。

        多态性的适用范围:适用于重写的方法,不适用于属性。

        但是,如此也看不出多态性有什么用处。多态性一般也不会直接用父类的引用来创建对象,那并不能体现多态性的优点。具体多态性的使用如下,还是以Animal和Dog和Cat举例。

         

         在adopt的参数列表中,参数animal的引用类型为Animal。在main方法中,创建Dog和Cat的对象dd和cc,再将dd和cc作为参数调用adopt方法。

         一个adopt的方法,可以同时供Cat类和Dog类的对象使用,因为参数的引用数据类型声明为Animal,而Cat和Dog是Animal的子类。

        如此可以看出,多态性的优点是,可以极大减少代码的冗余,不需要定义多个重载的方法,一个方法可以供多个子类使用。

        那么如果想要在adopt中调用Cat和Dog中的特有的方法,该如何做呢?

        这时候便要涉及到向下转型。

        向下转型即将父类的引用转化为子类的引用。需要使用强转符()。比如,Dog dog = (Dog)animal 。注:这种转换dog和animal的地址相同,指向内存中同一个对象的存储,只是二者的引用数据类型不同。

        还涉及到了一个关键字:instanceof,格式:a instance A 。instanceof是用来判断对象a是否是A类型或者A的子类类型的实例。如果是返回true,不是则返回false。

        如此,便可以用instanceof来判断传入的参数animal是哪个类的实例,再将animal的引用数据类型向下转型为相应的Animal的子类的引用数据类型之后,就可以调用相应的子类的特有的方法了。

        例:

        

        

        

 输出结果为:


http://lihuaxi.xjx100.cn/news/1738225.html

相关文章

【技术综述】深度学习模型结构复杂、参数众多,如何更直观地深入理解你的模型?...

CNN、RNN等深度学习模型使用的门槛虽然低,但模型参数多,网络结构复杂。输出如何关联模型的参数,在数学上没有很直观的解释,导致模型网络结构的设计以及训练过程中超参数的调试,都非常依赖于经验。结果不好,…

Combination Sum IV【中等难度】

Combination Sum IV【中等难度】 以下是一道力扣中等难度的题目:Combination Sum IV 题目描述: 给定一个由正整数组成的数组 nums 和一个正整数 target,请找出总和为 target 的不同组合的数量。组合中的数字可以在组合中出现任意次。 示例: 输入: nums = [1, 2, 3], tar…

3 — NLP 中的标记化:分解文本数据的艺术

一、说明 这是一个系列文章的第三篇文章, 文章前半部分分别是: 1 — NLP 的文本预处理技术2 — NLP中的词干提取和词形还原:文本预处理技术 在本文中,我们将介绍标记化主题。在开始之前,我建议您阅读我之前介绍…

微信小程序开发-微信支付退款功能【附有完整代码】

之前有写过详细的微信支付功能:微信支付 我们使用weixin-java-pay的jar包等,配置上的流程同微信支付,可以看上面的文章。 退款使用的WxPayService类的refundV3方法。使用该方法需要在微信支付配置的基础上加上:apiclient_key.pem…

[USACO23OPEN] Field Day S题解

远古的回忆。 把变换一个字符视为边权为 1 1 1 的边&#xff0c;即求最长路。 最长路不好搞&#xff0c;考虑转补集最短路&#xff08;容易感性理解&#xff09;&#xff0c;BFS 即可。 #include<bits/stdc.h> #define int long long using namespace std;const int …

Vue2.0和Vue3.0的区别

前言 vue经历从2.0到3.0更新之后&#xff0c;简⽽⾔之就是变得更轻&#xff0c;更快&#xff0c;使⽤起来更加⽅便&#xff0c;每⼀次的版本迭代都是对上⼀个版本的升级优化&#xff0c;不管 是对于我们开发者还是对于⽤户体验都是不断地在越来越⽅便&#xff0c;接下来我会着…

竞赛 深度学习手势检测与识别算法 - opencv python

文章目录 0 前言1 实现效果2 技术原理2.1 手部检测2.1.1 基于肤色空间的手势检测方法2.1.2 基于运动的手势检测方法2.1.3 基于边缘的手势检测方法2.1.4 基于模板的手势检测方法2.1.5 基于机器学习的手势检测方法 3 手部识别3.1 SSD网络3.2 数据集3.3 最终改进的网络结构 4 最后…

2023年四川省网络与信息安全技能大赛 决赛个人赛Writeup

文章目录 Web前端验证PHP_Try MiscHelloWorld密码在这easy_log Cryptobaser 线下“断网”CTF个人赛&#xff0c;题都很简单(新手级难度)&#xff0c;总共10道题目&#xff0c;解了6题。 赛题附件请自取&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1lgNEBO7a1L4KLE2t…