多态(polymorphism)
2020-10-17 longzqa@163.com stronglzq
【摘要】针对多态及相关知识进行阐述。继承关系中,多个子类都需要调用一个父类抽象方法,使用多态写法;采用多态写法后,无法调用子类特有方法,则需采用对象的向下转型。文章的行为逻辑为:
[多态是什么] -->[什么情况下使用多态写法] -->[如何使用多态] -->[多态存在什么缺陷] -->[多态缺陷的解决方案:向下转型] -->[向下转型缺陷及instanceof]
多态简述
多态是什么?面向对象编程(Object-Oriented Programming, OOP)的三大特性为封装(encapsulation)、继承(inheritance)、多态(polymorphism),其中多态是指一个对象有多种状态、多种“身份”,多态的前提条件存在上下级关系的类,如继承关系、接口实现关系。以继承关系为例,下图中,子类“Cat”的实例“cat”既是"Cat",又是“Animal”,即子类对象既是子类,又是父类。
注:多态的概念是对于“对象”的,对象有多种状态。
什么情况下适合使用多态?当多个子类都需要调用父类的某方法时,适合采用多态写法。例如下面例子中,子类“Cat”和“Dog”都需要调用父类“Animal”的“eat()”方法,此时适合采用多态写法。
public abstract class Animal{
// 抽象方法 eat
public abstract void eat();
}
public class Cat extends Animal{
// 覆盖重写父类的方法eat()
@Override
public void eat(){
System.out.println("猫吃鱼");
}
}
public class Dog extends Animal(){
@Override
public void eat(){
System.out.println("吃狗粮");
}
}
public class Demo{
public abstract void main(String[] args){
// 多态写法,左侧父类引用指向右侧子类对象
Animal animal = new Cat;
animal.eat();
}
}
多态缺陷及对象向下转型
多态的核心在于将子类对象看作父类来使用,此时存在一个缺陷,使用多态时,无法调用子类的特有方法,针对该缺陷,解决方案为对象的向下转型,通过转型后的对象来调用子类的特有方法。
对象的向下转型为将“看作为父类”使用的子类对象,向下转型为“子类对象”来使用,语法为父类 子类变量 = (父类)子类对象
。例如上述例子中“animal”向下转型为“Cat”类来使用,语句为Cat cat = (Cat)animal;
,例如:
public class Cat{
@Override
public void eat(){
System.out.println(“猫吃鱼”);
}
// 特有方法
public void uniqueCatMethod(){
System.out.println("猫特有方法");
}
}
public class Demo{
public static void main(String[] args){
// 多态写法,左侧父类引用指向右侧子类对象
Animal animal = new Cat();
// 调用父类方法
animal.eat();
//向下转型,调用子类特有方法
Cat cat = (Cat)animal;
cat.uniqueCatMethod();
}
}
向下转型缺陷及instanceof
进行向下转型时,必须转型回相应的子类,不然会报错“ClassCastException”,当子类较多时,常常会犯个错误,向下转型为其他的子类,导致报错。针对于该问题,解决方法为,在进行向下转型前,先判断该引用与子类是否一致,语句为if(animal instanceof Cat)
,例如在上述例子中,进行向下转型前进行判断:
public class Demo{
public static void main(String[] args){
// 多态写法,左侧父类引用指向右侧子类对象
Animal animal = new Cat();
animal.eat();
// instanceof判断,并向下转型
if(animal instanceof Cat){
Cat cat = (Cat)animal;
cat.uniqueCatMethod();
}else if(animal instanceof Dog){
Dog dog = (Dog)animal;
dog.uniqueDogMethod();
}
}
}
多态(polymorphism)的更多相关文章
- 7.6 GRASP原则六: 多态 Polymorphism
GRASP原则六: 多态 Polymorphism How to handle alternative behaviors based on type 如何处理依据类型不同而有 不同行为的一类需求 ...
- 《编程导论(Java)·2.1.2 啊,我看到了多态》-什么是多态(polymorphism)
1.不明觉厉 很多人学习多态时,会认为. 之所以不明觉厉,由于多态的定义:事物存在的多种表现形态:而后,有人将重载(overload).改写(override).多态变量和泛型归结于同一个术语&quo ...
- java面向对象之 多态 Polymorphism
多态(Polymorphism):用我们通俗易懂的话来说就是子类就是父类(猫是动物,学生也是人),因此多态的意思就是:父类型的引用可以指向子类的对象. 1.多态的含义:一种类型,呈现出多种状态 主要讨 ...
- C++ 多态Polymorphism 介绍+动态绑定、静态绑定
什么是多态? 多态(polymorphism)一词最初来源于希腊语polumorphos,含义是一种物质的多种形态. 在专业术语中,多态是一种运行时绑定机制(run-time binding) ,通过 ...
- 多态polymorphism,向上转型和动态方法调度有什么用?
多态有什么用?马 克 - t o - w i n:https://blog.csdn.net/qq_44639795/article/details/103117332我给大家想了两个 ...
- Java笔记(十五)……面向对象IV多态(polymorphism)
概述 定义:某一类事物的多种存在形态. 例:动物中猫,狗. 猫这个对象对应的类型是猫类型 猫 x = new 猫(); 同时猫也是动物中的一种,也可以把猫称为动物. 动物 y = new 猫(); 动 ...
- [18/12/03] 多态(polymorphism)和对象的转型(casting)
一.多态 多态指的是同一个方法调用,由于对象不同可能会有不同的行为.现实生活中,同一个方法,具体实现会完全不同. 比如:同样是调用人的“休息”方法,张三是睡觉,李四是旅游,同样是调用人“吃饭”的方法, ...
- 多态(Polymorphism)的实现机制
1. 我理解的广义的 override 是指抛开各种访问权限,子类重定义(redefine)父类的函数(即函数签名相同). 2. C++中的三个所谓的原则:never redefine base cl ...
- Java学习之 多态 Polymorphism
转自:http://www.cnblogs.com/mengdd/archive/2012/12/25/2832288.html 多态的概念 多态==晚绑定. 不要把函数重载理解为多态. 因为多态是一 ...
- 重构指南 - 使用多态代替条件判断(Replace conditional with Polymorphism)
多态(polymorphism)是面向对象的重要特性,简单可理解为:一个接口,多种实现. 当你的代码中存在通过不同的类型执行不同的操作,包含大量if else或者switch语句时,就可以考虑进行重构 ...
随机推荐
- [LeetCode]72. 编辑距离(DP)
题目 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1 ...
- 初等函数——指数函数(Exponential Function)
一般地,函数叫做指数函数,其中x是自变量,函数的定义域是R.
- 常用的Websocket技术一览
1. 前言 Websocket是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据 ...
- php Zookeeper使用踩坑
用的是Zookeeper扩展,Php版本为7.2.17,下载地址: https://pecl.php.net/package/zookeeper 用的是0.6.4版本 创建节点官方给的示例如下: &l ...
- 动态加载dll的实现+远线程注入
1.在目标进程中申请内存 2.向目标进程内存中写入shellcode(没有特征,编码比较麻烦) 3.创建远线程执行shellcode 之前可以看到shellcode很难编写还要去依赖库,去字符串区等等 ...
- C#设置装配加载选项
NX在打开装配时,需要设置加载方式,如下图所示: 因此,当装配进行了拷贝之后,PART路径变化,再次用NX打开时,会报无法加载的错误.这时需要重新设置从搜索文件夹打开,再次保存之后,之后再按照保存打开 ...
- js计算两个时间相差
.filter('useTime', function() { return function(val) { // if (/.(.mp4)$/gi.test(url)) { // return JS ...
- oracle数据库外部连接无法访问
服务器出现的问题是运行的项目无法访问oracle数据库连接,用plsql输入用户名密码后卡死,无法连接.但是通过命令窗口对oracle数据库操作正常,对oracle服务进行查看并重启,并无异常,运行t ...
- PCIE_DMA实例五:基于XILINX XDMA的PCIE高速采集卡
PCIE_DMA实例五:基于XILINX XDMA的PCIE高速采集卡 一:前言 这一年关于PCIE高速采集卡的业务量激增,究其原因,发现百度"xilinx pcie dma",出 ...
- 常见加密算法的 JS 实现
前言 为破解前端加密做准备,先了解一些常见的加密算法 分类 对称加密 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密. DES DES ...