Java之多态

news2024/11/23 19:33:59

多态

  • 多态的实现条件
  • 重写
    • 重写的定义
    • 重写的例子
    • 方法重写的条件
  • 多态思想
  • 动态绑定与静态绑定

在这里插入图片描述

作者简介: zoro-1,目前大一,正在学习Java,数据结构等
作者主页:zoro-1的主页
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

多态的实现条件

  1. 继承关系向上转型或向下转型
  2. 子类重写父类的方法
  3. 通过父类对象的引用调用这个重写的方法
    (完成上面三部分,就会发生动态绑定,动态绑定是多态基础)

重写

重写的定义

Java中,重写(override)是指在子类中对父类中已有的方法重新实现,以达到覆盖父类中的方法的效果,即在子类中重新定义一个方法与父类中的方法具有相同方法名、返回值类型和参数列表重写方法的访问权限不能低于父类中同名方法的访问权限。通过重写,子类可以改变继承来的方法的行为,从而实现自己的特殊需求。

重写的例子

以下是一个Java重写public父类方法的例子:

public class Animal {
    public void makeSound() {
        System.out.println("The animal makes a sound");
    }
}

public class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("The cat meows");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Cat cat = new Cat();

        animal.makeSound(); // Output: The animal makes a sound
        cat.makeSound(); // Output: The cat meows
    }
}
 

在上面的例子中,我们定义了一个父类 Animal 和一个子类 Cat,并在子类中重写了父类中的 makeSound() 方法。在 Main 类中,我们创建了一个 Animal 对象和一个 Cat 对象,并分别调用了它们的 makeSound() 方法。

由于 Cat 类重写了 makeSound() 方法,所以当我们调用 cat.makeSound() 方法时,输出的是 “The cat meows”。而当我们调用 animal.makeSound() 方法时,输出的是 “The animal makes a sound”,因为 Animal 类中的 makeSound() 方法没有被重写。

方法重写的条件

在Java中,方法被重写的条件包括:

  1. 方法名必须相同。
  2. 参数列表必须相同。
  3. 返回类型可以是相同的或者是子类。
  4. 方法的修饰符必须允许它被重写,即public、protected和不写修饰符的方法可以被重写。私有方法不能被重写
  5. 重写方法不能抛出比被重写方法更多的异常,或者抛出与被重写方法不兼容的异常。
  6. 重写方法的访问修饰符不能比被重写方法的访问修饰符更严格。例如,如果被重写方法是public,则重写方法不能是protected。
  7. 静态方法(static修饰,因为他不依赖类)不能被重写

需要注意的是,重写方法的返回类型可以是被重写方法返回类型的子类,但是参数列表必须和被重写方法的参数列表完全相同。这是因为Java使用参数列表来匹配方法调用,在重写方法时参数列表不一致会导致编译错误。

多态思想

在这里插入图片描述

动态绑定与静态绑定

动态绑定(Dynamic Binding)是指在程序运行时确定对象的类型及所要调用的方法,在编译时无法确定。在面向对象编程中,动态绑定是实现多态性的一种机制。

静态绑定中,程序在编译时就确定了要调用的方法,而在动态绑定中,程序在运行时根据对象的实际类型来确定要调用的方法。这使得程序具有更高的灵活性和扩展性,因为程序可以在运行时动态地适应不同的对象和场景。

在Java中,动态绑定是通过关键字“extends”和“implements”实现的。当一个类继承或实现了一个接口时,可以使用父类或接口类型的变量来引用子类或实现类的对象,从而实现动态绑定。例如:

interface Vehicle{
    void drive();
}

class Car implements Vehicle{
    public void drive(){
        System.out.println("Driving a car");
    }
}

class Bike implements Vehicle{
    public void drive(){
        System.out.println("Riding a bike");
    }
}

public class Main{
    public static void main(String[] args){
        Vehicle v1 = new Car();
        Vehicle v2 = new Bike();
        v1.drive(); //输出 "Driving a car"
        v2.drive(); //输出 "Riding a bike"
    }
}
 

在上面的例子中,接口Vehicle定义了一个drive()方法,而Car和Bike分别实现了该接口并实现了自己的drive()方法。在main方法中,v1和v2变量的类型都是Vehicle,但它们分别引用了一个Car对象和一个Bike对象。在调用drive()方法时,程序会根据实际对象类型来确定要调用哪个drive()方法,从而实现动态绑定。
(编译时调用Vehicle的 drive(),运行时调用子类drive(),编译看左边运行看右边)

今天的分享到这里就结束了,感谢大家支持,创作不易,希望大家能给博主个三连在这里插入图片描述

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

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

相关文章

7-7 整数152的各位数字

本题要求编写程序,输出整数152的个位数字、十位数字和百位数字的值。 输入格式: 本题无输入。 输出格式: 按照以下格式输出: 152 个位数字 十位数字*10 百位数字*100代码长度限制 16 KB 时间限制 400 ms 内存限制 64…

Mac 卸载appium

安装了最新版的appium 2.0.1,使用中各种问题,卡顿....,最终决定回退的。记录下卸载的过程 1.打开终端应用程序 2.卸载全局安装的 Appium 运行以下命令以卸载全局安装的 Appium: npm uninstall -g appium 出现报错:Error: EACCES: permiss…

命题与命题联结词

一、命题 什么是命题? 具有确切真值的陈述句称为命题。疑问句、感叹句、祈使句都不是命题。 例如: 是命题 1加1等于3雪是黑色的 不是命题有: 太好啦!X0X>1 原子命题(简单命题)——不能分解的…

1572. 矩阵对角线元素的和

题目描述: 给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例: 解题思路: 同时求对角线和副对角线上元素的和再减去重合的元素 相关代码&#xf…

期权定价模型系列【5】—ETF期权数据

1.前言 对期权定价模型进行研究时,往往需要匹配的实际数据,国内上市时间超过两年、主流的ETF期权包括华夏上证50ETF期权、沪深300ETF期权等,其对应的标的资产分别为华夏上证50ETF、华泰柏瑞沪深300ETF、嘉实沪深300ETF。 2.上证50ETF期权合约…

刨根问底,不再纠结Linux 文件权限问题

Linux 与Windows的区别 与Windows 系统不一样,在Linux系统中,无论是系统内核还是应用程序,都是文件。正如此,当你学习Linux中遇到问题时,总能看到热心网友的解决方法: rm -rf * 一旦运行此命令&#x…

Docker的基本概念及镜像加速器的配置

1.Docker的概念 由于代码运行环境不同,代码运行会出现水土不服的情况。运用docker容器会把环境进行打包,避免水土不服。docker是一种容器技术,它解决软件跨环境迁移的问题。 2,安装Docker 3.Docker架构 4.Docker镜像加速器的配…

模拟实现消息队列(以 RabbitMQ 为蓝本)

目录 1. 需求分析1.1 介绍一些核心概念核心概念1核心概念2 1.2 消息队列服务器(Broker Server)要提供的核心 API1.3 交换机类型1.3.1 类型介绍1.3.2 转发规则: 1.4 持久化1.5 关于网络通信1.5.1 客户端与服务器提供的对应方法1.5.2 客户端额外…

国产数据库-内核特性-低基数全局字典

国产数据库-内核特性-StarRocks低基数全局字典 StarRocks2.0引入了低基数全局字典,可以通过全局字典将字符串的相关操作转换成整型相关操作,大大提升查询性能。 1、低基数字典 对于利用整型替代字符串进行处理,通常使用字典编码进行优化。Sta…

基于WebSocket的在线文字聊天室

与Ajax不同,WebSocket可以使服务端主动向客户发送响应,本案例就是基于WebSocket的一个在线聊天室,不过功能比较简单,只能满足文字交流。演示如下。 案例学习于b站up主,链接 。这位up主讲的非常清楚,值得去学…

【并发编程JUC】Future和CompletableFuture机制

场景题 面试的时候当面试官提出一个场景题,比如有一个翻译接口,同时调用百度、网易、谷歌的三个翻译接口,使用返回的第一个的翻译。这个时候一般的想法可能是,先串行执行。然后异步获取。但是其实都知道这样性能非常慢。 Future…

Baumer工业相机堡盟工业相机如何通过BGAPISDK设置相机的固定帧率(C#)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的固定帧率(C#) Baumer工业相机Baumer工业相机的固定帧率功能的技术背景CameraExplorer如何查看相机固定帧率功能在BGAPI SDK里通过函数设置相机固定帧率 Baumer工业相机通过BGAPI SDK设置相机固定帧…

【Linux系统编程】22.exec函数、execlp、execl、execvp

目录 exec函数 execlp 参数file 返回值 测试代码1 测试结果 execl 测试代码2 测试结果 execvp 测试代码3 测试结果 exec函数 fork创建子进程后执行的是和父进程相同的程序,但有可能执行不同的代码分支,子进程往往要调用一种exec函数以执行另…

如何在Vue2.X/Vue3.X项目引入jQuery,以及增加jQuery.easing扩展?让你的动画效果更加丝滑!

前言 还记得在2015左右,网页开发依然是jQuery的天下,虽然Vue、React开始盛行,以及后面Angular也开始抢占市场,但是jQuery在市场上依然占有较大的比重。当时的html页面大多是用jQuery来写的,为jQuery设计的插件也是相当…

应用层协议——TCP(上)

文章目录 1. TCP协议1.1 TCP协议段格式1.2 确认应答(ACK)机制1.3 16位窗口大小1.4 6位标志位1.4.1 TCP三次握手 1.5 确认应答(ACK)机制1.6 超时重传机制1.7 连接管理机制1.7.1 理解TIME_WAIT状态1.7.2 理解 CLOSE_WAIT 状态 1. TCP协议 TCP全称为传输控制协议,意思…

双端口存储器原理实验

1.实验目的及要求 1.1实验目的 1)了解双端口静态随机存储器IDT7132的工作特性及使用方法。 2)了解半导体存储器怎样存储和读出数据。 3)了解双端口存储器怎样并行读写,并分析冲突产生的情况。 1.2实验要求 1)做好…

百度屏蔽词有哪些?其中就有移民关键词指数被屏蔽?

我是百收网SEO,点点上面的头像,欢迎关注我哦! 今日tombkeeper消息爆料:百度指数已经屏蔽“移民”等关键词指数。 大家好,我是百收网SEO商学院的狂潮微课老师,今天我们来讲解第 12 节课关键词优化难度分析…

JZ39数组中出现次数超过一半的数字

题目地址:数组中出现次数超过一半的数字_牛客题霸_牛客网 题目回顾: 解题思路: 最简单用哈希表来记录每个数字在数组中出现的次数,在遍历这个数组时同时进行判断是否满足条件。 整体代码: public int MoreThanHalfNum…

腾讯云服务器竞价实例是什么意思?CVM计费模式选择说明

腾讯云服务器CVM计费模式分为包年包月、按量计费和竞价实例,什么是竞价实例?竞价实例和按量付费相类似,优势是价格更划算,缺点是云服务器实例有被自动释放风险,腾讯云服务器网来详细说下什么是竞价实例?以及…