java中多态的用法

思维导图:

 

1. 多态的概念

多态通俗的讲就是多种形态同一个动作,作用在不同对象上,所产生不同的形态。

例如下图:

2. 多态的实现条件

Java中,多态的实现必须满足以下几个条件:
1. 必须在继承体系下
2. 子类必须重写父类中的方法
3. 通过父类的引用调用重写方法


多态体现:在代码运行时,当传递不同对象时,会调用对应类中的方法
看以下代码:

 
public abstract class Animal {String name;int age;public Animal(String name,int age){this.name = name;this.age = age;}public void eat(){System.out.println(name+"吃粮食");}
}public class Dog extends Animal {public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(name+"爱吃骨头");}
}
///public class Cat extends Animal {public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(name+"爱吃鱼");}
}/public class TestAnimal {//编译器在编译代码时,并不知道调用Dog还是Cat中的eat方法//等程序运行起来后,形参a引用的具体对象确定后,才知道调用哪个方法//注意:此处的形参类型必须是父类类型才可以public static void eat(Animal a){a.eat();}public static void main(String[] args) {Dog dog = new Dog("旺财",2);Cat cat = new Cat("糯米",1);eat(dog);eat(cat);}
}

3. 重写


重写(override)也称为覆盖,重写是子类对父类非静态,非private修饰,非final修饰,非构造方法等的实现过程进行重新编写返回值和形参都不能改变,核心重写。

方法重写规则:

1:子类重写父类方法时,一般必须与父类方法原型保持一致:修饰符 返回值类型 方法名(参数列表)要完全一致

2:JDK7以后,被重写的方法返回值类型可以不同,但是必须具有父子关系

3: 访问权限不能比父类父类中被重写的方法的访问权限低。

4:父类中被static private 修饰的方法,构造方法都不能被重写

5:重写的方法可以用@Override注解来显示指定

 重写和重载的区别:

 即:方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现

静态绑定:也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型确定具体调用哪个方法。典型代表:重载

动态绑定:也成为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时才能够确定调用哪个类的方法

 4:向上转型和向下转型

 向上转型:一个父类对象的引用指向一个子类对象的实例。
 语法格式:父类类型  对象名  =   new  子类类型();

 如:Animal animal = new Cat("小七",1);

animal是父类类型,但可以引用一个子类对象,即:可以将一个子类对象当成父类对象来引用。因此:向上转型是安全的,因为是从小范围向大范围的转换。

使用场景:1:直接赋值     2:方法传参     3:方法返回

请看如下代码:

public class TestAnimal {//方法传参:形参为父类类型引用,可以接受任意子类对象public static void eat(Animal a){a.eat();}//作为返回值:返回任意子类对象public static Animal buyAnimal(String var){if("狗" == var){return new Dog("小七",2);}else if("猫" == var){return new Cat("汤圆",1);}else{return null;}}public static void main(String[] args) {Animal dog = new Dog("旺财",2);   //直接赋值:子类对象赋给父类对象Aniaml cat = new Cat("糯米",1);eat(dog);eat(cat);Animal animal = buyAnimal("狗");animal.eat();animal = buyAnimal("猫");animal.eat();}
}

向上转型的优点:让代码实现更简单灵活
向上转型的缺陷:不能调用到子类特有的方法 

 向下转型
将一个子类对象向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的方法,此时:将父类引用再还原为子类对象即可,即向下转型。

public class TestAnimal {public static void eat(Animal a){a.eat();}public static void main(String[] args) {Dog dog = new Dog("旺财",2);Cat cat = new Cat("糯米",1);Animal animal = dog;animal.eat();// animal.bark();    编译器报错,Animal类中没有bark方法dog = (Dog)animal;dog.bark();animal = cat;animal.eat();// animal.mew();    编译器报错,Animal类中没有mew方法cat = (Cat)animal;cat.mew();}
}

向下转型不安全,万一转型失败,运行就会抛异常。Java中为了提高向下转型的安全性,引入了instanceof,如果该表达式为true,则可以安全转换 

public class TestAnimal {public static void eat(Animal a){a.eat();}public static void main(String[] args) {Dog dog = new Dog("旺财",2);Cat cat = new Cat("糯米",1);Animal animal = dog;animal.eat();animal = cat;animal.eat();if(animal instanceof Dog){dog = (Dog)animal;dog.bark();}if(animal instanceof Cat){cat = (Cat)animal;cat.mew();}}
}

 多态的优点
 1:能够降低代码的“圈复杂度”,避免使用大量的if-else
假如我们现在要打印多个形状而不是一个形状

public static void drawShapes(){Ret ret = new Rect();Cycle cycle = new Cycle();Flower flower = new Flower();String[] shapes = {"cycle","ret","flower","cycle","flower"};for(String shape : shapes){if(shape.equals("cycle")){cycle.draw();}if(shape.equals("ret")){ret.draw();}if(shape.equals("flower")){flower.draw();}}}

 如果使用多态,代码更简单:请看如下代码:

 public static void drawShapes(){Shape[] shapes = {new Cycle(),new Rect(),new Cycle(),new Flower()};for(Shape shape : shapes){shape.draw;}}

2. 可扩展能力强
增加一种新的形状,使用多态的方式代码改动成本低

class Tringle extends Shape{@Overridepublic void draw(){System.out.println("三角形");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将mars3D导入自己的项目中

文章目录 一、打开自己的vite项目二、创建场景配置文件1.json文件路径 public\config\config.json2.创建组件定义文件路径 src\components\mars-work\mars-map.vue三、demo中引入四、必要样式 依赖文件 总结 一、打开自己的vite项目 我创建了一个新的 结构如下 二、创建场景…

Netty技术全解析:EventLoopGroup类详解

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

java学校--Object类方法--toString

第一点解析&#xff1a; 全类名就是包名加类名 getClass&#xff08;&#xff09;.getName()是得到其包名和类名如图&#xff0c;包名是com.hspedu.object_类名是Monster。 Integer.toHexString&#xff08;hashCode&#xff08;&#xff09;&#xff09;&#xff1b;是得到其…

Spring中@PostConstruct注解的使用

1.描述 1.1 背景 最近在做一个系统交互日志模块&#xff0c;要监控一个http请求&#xff0c;并记录请求与响应日志。项目中使用RestTemplate来发送http请求&#xff0c;所以打算给RestTemplate设置拦截器&#xff0c;来进行自定义操作。但是&#xff0c;只对当前类生效&#x…

Java文件IO操作知识点

关于文件 关于IO的定义 I:input输入 O:output输出,这是一套人为规定的规则,下面这个图方便我们理解输入输出的定义,统一以CPU为基准 在操作系统中其实把很多的资源都抽象成文件,我们在这里所说的文件就是"狭义"文件,平时保存在硬盘上的文件, 文件夹也是一种文件,我们…

「iOS」自定义cell与cell的复用

iOS学习 前言一&#xff1a;TableView协议二&#xff1a;cell的复用Cell的复用原理自定义cell总结 前言 UITableView是iOS开发中不可或缺的一部分&#xff0c;它是苹果iOS SDK提供的一种用于展示数据列表的视图控件。我们对其中的cell进行自定义&#xff0c;即可得到我们需要的…

Python 实现股票指标计算——BBI

BBI (Bull And Bear lndex) - 多空指标 1 公式 3日均价 3日收盘价之和 / 36日均价 6日收盘价之和 / 612日均价 12日收盘价之和 / 1224日均价 24日收盘价之和 / 24BBI (3日均价 6日均价 12日均价 24日均价) / 4 2 数据准备 我们以科创50指数 000688 为例&#xff0c…

Qt 学习第一天:安装VS和Qt

本人更换了一台新的电脑&#xff0c;使用联想电脑管家传输文件后没有安装VS&#xff0c;导致出现了以下问题&#xff1a; 疯狂查资料问人。弄了一个晚上加上午一个多小时之后&#xff0c;还是决定删掉原来的文件夹&#xff0c;重新下载一个 一、安装VS&#xff08;Visual Stud…

算法项目报告:物流中的最短路径问题

问题描述 物流问题 有一个物流公司需要从起点A到终点B进行货物运输&#xff0c;在运输过程中&#xff0c;该公司需要途径多个不同的城市&#xff0c;并且在每个城市中都有一个配送站点。为了最大程度地降低运输成本和时间&#xff0c;该公司需要确定经过哪些配送站点&#xff…

Android:requestLayout、invalidate 和 postInvalidate 的区别

提醒&#xff1a;下面源码来自SDK里Android-34版本 一、requestLayout 点击查看requestLayout官网文档 1.1 requestLayout方法源码 /*** Call this when something has changed which has invalidated the* layout of this view. This will schedule a layout pass of the v…

C++ :友元类

友元类的概念和使用 (1)将类A声明为B中的friend class后&#xff0c;则A中所有成员函数都成为类B的友元函数了 (2)代码实战&#xff1a;友元类的定义和使用友元类是单向的 (3)友元类是单向的&#xff0c;代码实战验证 互为友元类 (1)2个类可以互为友元类&#xff0c;代码实战…

【LeetCode】二叉树的最大深度

目录 一、题目二、解法完整代码 一、题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#x…

Leetcode2160. 拆分数位后四位数字的最小和:

问题描述&#xff1a; 给你一个四位 正 整数 num 。请你使用 num 中的 数位 &#xff0c;将 num 拆成两个新的整数 new1 和 new2 。new1 和 new2 中可以有 前导 0 &#xff0c;且 num 中 所有 数位都必须使用。 比方说&#xff0c;给你 num 2932 &#xff0c;你拥有的数位包括…

怎么剪辑音频文件?4款适合新的音频剪辑软件

是谁还不会音频剪辑&#xff1f;无论是个人音乐爱好者&#xff0c;还是专业音频工作者&#xff0c;我们都希望能找到一款操作简便、功能强大且稳定可靠的音频剪辑工具。今天&#xff0c;我就要为大家带来四款热门音频剪辑软件的体验感分享。 一、福昕音频剪辑 福昕音频剪辑是…

YOLO 模型基础入门及官方示例演示

文章目录 Github官网简介模式数据集Python 环境Conda 环境Docker 环境部署 CPU 版本官方 CLI 示例官方 Python 示例 任务目标检测姿势估计图像分类 Ultralytics HUB视频流示例 Github https://github.com/ultralytics/ultralytics 官网 https://docs.ultralytics.com/zhhttp…

【IEEE出版】第四届能源工程与电力系统国际学术会议(EEPS 2024)

第四届能源工程与电力系统国际学术会议&#xff08;EEPS 2024&#xff09; 2024 4th International Conference on Energy Engineering and Power Systems 重要信息 大会官网&#xff1a;www.iceeps.com 大会时间&#xff1a;2024年8月9-11日 大会…

2024年7月萤火虫航天为NASA发射8颗立方体卫星

作为美国宇航局立方体卫星发射计划的一部分&#xff0c;萤火虫航空航天公司于7月3日在该公司的阿尔法火箭上发射了八颗小型卫星。这枚名为“夏日噪音”的火箭于太平洋夏令时&#xff08;PDT&#xff09;晚上9点04分从加利福尼亚州范登堡空军基地的2号航天发射场成功升空。 立方…

解读vue3源码-响应式篇2

提示&#xff1a;看到我 请让我滚去学习 文章目录 vue3源码剖析reactivereactive使用proxy代理一个对象1.首先我们会走isObject(target)判断&#xff0c;我们reactive全家桶仅对对象类型有效&#xff08;对象、数组和 Map、Set 这样的集合类型&#xff09;&#xff0c;而对 str…

【数学建模】多波束测线问题(持续更新)

多波束测线问题 问题 1建立模型覆盖宽度海水深度重叠长度重叠率 问题二问题三问题四 问题 1 与测线方向垂直的平面和海底坡面的交线构成一条与水平面夹角为 α \alpha α的斜线&#xff08;如下图&#xff09;&#xff0c;称 α \alpha α为坡度。请建立多波束测深的覆盖宽度及…

Python代码,强化学习,深度学习

python代码编写&#xff0c;Python算法设计&#xff0c;强化学习优化&#xff0c;改进模型&#xff0c;训练模型&#xff0c;测试模型&#xff0c;可视化绘制&#xff0c;代编运行结果&#xff0c;交互多模型改进&#xff0c;预测模型&#xff0c;算法修改&#xff0c;Python包…