Java:多态

news2024/12/27 11:08:17

目录

  • 1.向上转型
  • 2.动态绑定
  • 3.方法重写
  • 4.理解多态
  • 5.多态的优缺点

1.向上转型

把子类对象给到父类,代码如下

class Animal{
    public String name;
    public int age;
    public void eat(){
        System.out.println(this.name+"正在吃饭!");
    }
}
class Dog extends Animal{
    public void bark(){
        System.out.println(this.name+"汪汪叫!");
    }
}
public class Mian {
    public static void main(String[] args) {
        Animal dog=new Dog();//dog无法访问到Dog类中的bark方法
        	//原因:Animal中没用bark方法,即通过父类访问只能访问父类中的方法
    }
}

发生向上转型的3个时机
在这里插入图片描述
向上转型的优点:让代码实现更简单灵活。
向上转型的缺陷:不能调用到子类特有的方法。

(向下转型加instanceof判断,防止错转)

2.动态绑定

通过向上转型我们可以在子类中重写父类的方法实现动态绑定,来达到不同子类完成某个行为产生不同的状态,如下所示:

class Animal{
    public String name;
    public int age;
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void eat(){
        System.out.println(this.name+"正在吃饭!");
    }
}
class Dog extends Animal{
    public void eat(){//重写eat方法
        System.out.println(this.name+"在吃狗粮!");
    }
    public Dog(String name, int age) {
        super(name, age);
    }
    public void bark(){
        System.out.println(this.name+"汪汪叫!");
    }
}
public class Mian {
    public static void main(String[] args) {
        Animal dog=new Dog("小黄",10);
        dog.eat();
    }
}

动态绑定的必要条件:
在这里插入图片描述

3.方法重写

重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。重写举例可看上面动态绑定的代码。
方法重写注意事项
在这里插入图片描述
方法重写的规则

  1. 子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致
  2. 被重写的方法返回值类型可以不同,但是必须是具有父子关系的
  3. 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为 protected
  4. 父类被static、private修饰的方法、构造方法都不能被重写。
  5. 重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心将方法名字拼写错了 (比如写成 aet), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写.

重写和重载的区别
在这里插入图片描述
重写的设计原则
对于已经投入使用的类,尽量不要进行修改。最好的方式是:重新定义一个新的类,来重复利用其中共性的内容,并且添加或者改动新的内容。

4.理解多态

1.多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。
2.代码说明讲解

class Animal{
    public String name;
    public int age;
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void eat(){
        System.out.println(this.name+"正在吃饭!");
    }
}
class Dog extends Animal{

    @Override
    public void eat(){
        System.out.println(this.name+"在吃狗粮!");
    }
    public Dog(String name, int age) {
        super(name, age);
    }

    public void bark(){
        System.out.println(this.name+"汪汪叫!");
    }
}
class Cat extends Animal{
    public Cat(String name, int age) {
        super(name, age);
    }
    @Override
    public void eat() {
        System.out.println(this.name+"正在吃猫粮!");
    }
    public void miaomiao(){
        System.out.println(this.name+"喵喵叫!");
    }
}
public class Mian {
    public static void func(Animal animal){
        animal.eat();
    }
    public static void main(String[] args) {
        Dog dog=new Dog("小黄",10);
        Cat cat=new Cat("小花",4);
        func(dog);
        func(cat);
    }
}

输出结果
在这里插入图片描述
在这里插入图片描述
看过上面举例代码和对动态绑定、向上转型的理解后我们再来理解多态的概念,当dog和cat同时去完成“吃”这个动作时,他们产生不同状态,分别在Dog和Cat类中重写了eat方法,达到此效果。

5.多态的优缺点

优点
1.能够降低代码的 “圈复杂度”, 避免使用大量的 if - else
在这里插入图片描述
2.可扩展能力更强
拿下面代码举例,对于类的调用者来说(使用eat方法), 只要创建一个新类的实例就可以了, 改动成本很低。

class Animal{
    public String name;
    public int age;
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void eat(){
        System.out.println(this.name+"正在吃饭!");
    }
}

缺陷
1.代码的运行效率降低。
2.属性没有多态性,当父类和子类都有同名属性的时候,通过父类引用,只能引用父类自己的成员属性
3.构造方法没有多态性

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

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

相关文章

力扣映射思辨题:赎金信

思路很简单&#xff1a;查到就改 bool canConstruct(char* ransomNote, char* magazine) {for(long x0;x<strlen(ransomNote);x){for(long y0;y<strlen(magazine);y){if(magazine[y]ransomNote[x]){ransomNote[x]1;magazine[y]1;break;}}}for(long x0;x<strlen(ranso…

【ArcGIS 脚本工具】批量导出布局为图片

文章开始前要介绍一下ArcMap与ArcPro在布局上的区别。 ArcMap10.x版本的mxd文件默认只有一个布局&#xff0c;所以如果一个项目需要出几张图&#xff0c;做好的办法就是建几个mxd文件。 但是ArcPro在这方面更加整合了&#xff0c;一个aprx文件内可以新建任意多的布局&#xff…

无人机助力智慧农田除草新模式,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建无人机航拍场景下的农田杂草检测识别系统

科技发展到今天&#xff0c;无人机喷洒药物已经不是一件新鲜事情了&#xff0c;在很多高危的工作领域中&#xff0c;比如高空电力设备除冰&#xff0c;电力设备部件传送更换等等&#xff0c;无人机都可以扮演非常出色的作用&#xff0c;前面回到老家一段时间&#xff0c;最近正…

内网渗透之路:常用命令助力信息深度探索

1、查询网络配置信息 ipconfig /all 2、查询操作系统及软件信息 &#xff08;1&#xff09;查询操作系统和版本信息 英文操作系统 systeminfo | findstr /B /C:"OS Name" /C:"OS Version" 中文操作系统 systeminfo | findstr /B /C:"OS 名称&q…

【C#】int+null=null

C#语法&#xff0c;这玩意不报错 intnullnull&#xff0c;有点不合逻辑 (Int32)(bizRepair0rder.CreateTime. Value - regues.Mlodifylime.Value).TotalMinutes (Int32)(bizRepair0rder.CreateTime. Value - reques.llodifylime.Value).TotalMinutes nullstring是引用类型&…

【C#】【SAP2000】读取SAP2000中所有Frame对象在指定工况的温度荷载值到Grasshopper中

if (build true) {// 连接到正在运行的 SAP2000// 使用 COM 接口获取 SAP2000 的 API 对象cOAPI mySapObject (cOAPI)System.Runtime.InteropServices.Marshal.GetActiveObject("CSI.SAP2000.API.SapObject");// 获取 SAP2000 模型对象cSapModel mySapModel mySap…

PlantUML + VS Code

PlantUML 使用实例 文章目录 PlantUML 使用实例1. PlantUML简介1.1 什么是PlantUML1.2 PlantUML优势在哪 2. 怎么用2.1 环境依赖2.2 VS Code组件安装 3. 常用语法3.1 标记开始结束3.2 声明参与者3.3 声明关系3.4 对消息序列编号3.5 组合消息 4. 实例 1. PlantUML简介 1.1 什么…

NCDA大赛中哪些HTML5设计作品展现出色?

与传统的HTML网页设计相比&#xff0c;HTML5网页设计主要是对网页内容的加强。HTML5已成为目前最流行的标记语言&#xff0c;拥有成熟的社区和广泛的浏览器支持&#xff0c;HTML5完整的功能和强大的扩展性使设计师和开发者能够点铁成金。HTML5可以一手控制更多可控元素&#xf…

HDS-NAS分配资源并挂载win和linux

1、首先创建系统文件。 选择nas存储池 2、根据自己的需求创建相应的挂载方式 3、window配置 配置成功 最后即可在window系统网络位置映射网络即可&#xff0c; 格式为\\123.3.4.5\test 注&#xff1a;IP地址 4、liunx挂载方式 创建完成之后即可挂载&#xff0c;注意目的主…

Vue+OpenLayers7入门到实战:OpenLayers如何使用全屏控件,来实现地图容器的全屏和退出全屏功能

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战 前言 本章介绍如何使用OpenLayers7在地图上使用地图全屏控件,来控制地图容器的全屏和退出全屏的功能。 注意:这里的全屏控件全屏指的是地图容器全屏,并非整个网页全屏。 网页整体全屏和指定网页节点全屏可以参…

FreeRTOS的学习路径介绍

FreeRTOS是一种广泛使用的开源实时操作系统&#xff08;RTOS&#xff09;&#xff0c;它被设计为一个小型、可扩展的操作系统&#xff0c;适用于微控制器和嵌入式系统。由于其轻量级和可扩展性&#xff0c;FreeRTOS被广泛应用于物联网&#xff08;IoT&#xff09;、工业自动化、…

简单了解 vim 编辑器最基础的操作

简单了解 vim 编辑器最基础的操作 vim 这个是 Linux 上自带的一个文本编辑器&#xff0c;使用 vim 就可以更灵活的对文件进行编辑了&#xff08;虽然和记事本的定位差不多,实际上vim的使用要复杂很多&#xff09; 1.打开文件 语法&#xff1a;vim 文件名 示例&#xff1a;…

mysql 排序底层原理解析

前言 本章详细讲下排序&#xff0c;排序在我们业务开发非常常见&#xff0c;有对时间进行排序&#xff0c;又对城市进行排序的。不合适的排序&#xff0c;将对系统是灾难性的&#xff0c;这个不是危言耸听。可能有些人会想&#xff0c;对于排序mysql 是怎么实现的&#xff0c;…

【计算机网络篇】计算机网络的性能指标

文章目录 &#x1f354;计算机网络的性能指标&#x1f5c3;️常见的计算机网络性能指标⭐速率⭐带宽⭐吞吐量⭐时延⭐时延带宽积⭐往返时间⭐利用率⭐丢包率 &#x1f50e;总结 &#x1f354;计算机网络的性能指标 计算机网络的性能指标被用来从不同方面度量计算机网络的性能 …

02-Java变量和运算符

1. 基本数据类型转换&#xff08;Conversion&#xff09; 在Java程序中&#xff0c;不同的基本数据类型的值经常需要进行相互转换。Java语言所提供的七种数值类型之间可以相互转换&#xff0c;基本数据类型转换有两种转换方式&#xff1a;自动类型转换和强制类型转换。boolean…

江科大stm32学习笔记【6-2】——定时器定时中断定时器外部时钟

一.定时器定时中断 1.原理 2.硬件 3.程序 此时CK_PSC72M&#xff0c;定时1s&#xff0c;也就是定时频率为1Hz&#xff0c;所以可以PSC7200-1,ARR10000-1。 Timer.c: #include "stm32f10x.h" // Device headerextern uint16_t Num;//声明跨文件的…

Python爬虫:原理与实战

引言 在当今的信息时代&#xff0c;互联网上的数据如同浩瀚的海洋&#xff0c;充满了无尽的宝藏。Python爬虫作为一种高效的数据抓取工具&#xff0c;能够帮助我们轻松地获取这些数据&#xff0c;并进行后续的分析和处理。本文将深入探讨Python爬虫的原理&#xff0c;并结合实战…

中国首个基于区块链的分布式算力网络上线

随着美国人工智能公司OpenAI近期发布的Sora视频模型&#xff0c;全球对高性能算力的需求突破了历史新高。Sora的创新在于它能够以超长生成时间、多角度镜头捕捉&#xff0c;理解物理世界的能力&#xff0c;这不仅是技术的一大突破&#xff0c;更是对算力需求的一大挑战。在这样…

VS2022开发上位机流程

1、生成串口调试助手的主要控件 2、生成串口对象 3、书写代码 3.1 串口的选择 跳转到图形化界面&#xff0c;然后双击空白位置&#xff0c;会自动生成From1_Load,此函数的作用是会更新串口的选择&#xff0c;然后加入代码&#xff0c;combox控件就可以识别串口 /* 新增自定义…

微信小程序云开发教程——墨刀原型工具入门(表单组件)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…