【我与Java的成长记】之多态,重载与重写详解

在这里插入图片描述

系列文章目录

能看懂文字就能明白系列
C语言笔记传送门
Java笔记传送门
🌟 个人主页:古德猫宁-

🌈 信念如阳光,照亮前行的每一步


文章目录

  • 系列文章目录
    • 🌈 *信念如阳光,照亮前行的每一步*
  • 前言
  • 一、多态的概念
  • 二、多态的实现条件
  • 三、补充:重载与重写
    • 重载的概念
    • 重载的例子
    • 重载的规则
    • 重写的概念
    • 重写的例子
    • 重写的规则
    • 重载与重写的区别
  • 四、向上转型和向下转型
    • 向上转型
    • 向下转型
  • 多态的优缺点


前言

本节目标:理解多态的思想,掌握多态的使用,理解什么是向上转型和向下转型


一、多态的概念

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。(即同一件事情,发生在不同对象身上,就会产生不同的结果)

二、多态的实现条件

在Java中要实现多态,必须要满足如下几个条件,缺一不可:

  1. 条件一:必须在继承体系下实现向上转型
  2. 条件二:子类必须要对父类中方法进行重写
  3. 条件三:通过父类的引用调用重写的方法
    完成以上三个条件,就会发生动态绑定,而动态绑定是多态的基础
    多态的体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法

通过代码来解释一下:

class Parent{
    public void name(){
        System.out.println("I am father");
    }
}
class Son extends Parent{//条件一:必须在继承体系下
    public void name(){//条件二:子类必须要对父类中的方法进行重写
        System.out.println("I am son");
    }
}
class Daughter extends Parent{//条件一:必须在继承体系下
    public void name(){//条件二:子类必须要对父类中的方法进行重写
        System.out.println("I am daughter");
    }
}
public class test3 {
    public static void main(String[] args) {
        Parent parent1 = new Son();//父类的引用指向了子类1的对象
        Parent parent2 = new Daughter();//父类的引用指向了子类2的对象
        parent1.name();//条件三:通过父类的引用调整重写的方法
        parent2.name();
    }
}

在这里插入图片描述

三、补充:重载与重写

重载的概念

重载(overload)指在同一个类中,多个方法有同样的名称,但参数列表不同,这样的同名且不同参数的方法就称为方法重载。

重载的例子

class Test {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int ret = add(a, b);
        System.out.println("ret = " + ret);
        double a2 = 10.5;
        double b2 = 20.5;
        double ret2 = add(a2, b2);
        System.out.println("ret2 = " + ret2);
        double a3 = 10.5;
        double b3 = 10.5;
        double c3 = 20.5;
        double ret3 = add(a3, b3, c3);
        System.out.println("ret3 = " + ret3);
    }
    public static int add(int x, int y) {
        return x + y;
    }
    public static double add(double x, double y) {
        return x + y;
    }
    public static double add(double x, double y, double z) {
        return x + y + z;
    }
}

如上面的代码中,方法的名字都叫add,但是有的add是计算int相加,有的是double相加,有的计算两个数字相加,有的是计算三个数相加。
同一个方法名字,提供不同版本的实现就是方法重载。

重载的规则

针对同一个类:

  • 方法名相同
  • 方法的参数不同(参数个数或者参数类型)
  • 方法的返回值类型不影响重载
  • 当两个方法的名字相同,参数也相同,但是返回值不同的时候,不构成重载

重写的概念

重写(override)也称覆盖。重写是子类对父类非静态,非private修饰,非final修饰,非构造方法等的实现过程进行重写编写,返回值和形参都不能改变。即外壳不变,核心重写。重写的好处在于子类可以根据需求,定义特定于自己的行为,也就是说子类能够根据需要实现父类的方法。

重写的例子

class Shape{
    public void draw(){
        System.out.println("画图形!");
    }
}
class Rect extends Shape{
    @Override
    public void draw() {
        System.out.println("画矩形");
    }
}
class Cycle extends Shape{
    @Override
    public void draw() {
        System.out.println("○");
    }
}
class Flower extends Shape{
    @Override
    public void draw() {
        System.out.println("❀");
    }
}

重写的规则

  • 子类在重写父类的方法时,一般必须与父类方法原型一致:返回值类型,方法名(参数列表)要完全一致。
  • 被重写的方法返回值类型可以不同,但是必须是具有父子类关系的。
  • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为protected。(访问权限从小到大为:private,default,protected,public)
  • 父类被static、private、final修饰的方法,构造方法都不能被重写
  • 重写的方法,可以使用@Override注解来显式指定,有了这个注解能帮我们进行一些合法性校验。

重载与重写的区别

区别点重写重载
参数列表一定不能修改必须修改
返回类型一定不能修改(除非可以构成父子类关系)可以修改
访问限定符一定不能做更严格的限制(可以降低限制)可以修改
重点重写是一个运行期概念重载是一个编译期概念
重写遵循“运行期绑定”,即在程序运行时,根据引用变量所指向的实际对象的类型来调用方法重载遵循“编译期绑定”,即在编译时根据参数变量的类型判断应该调用哪个方法

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

补充:
静态绑定:也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用哪个方法。典型代表:方法重载
动态绑定:也称为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能确定具体调用哪个类的方法。

四、向上转型和向下转型

向上转型

向上转型:实际就是创建一个子类对象,将其当成父类对象来使用
语法格式:父类类型 对象名 = new 子类类型()

Animal animal = new Cat(“波斯猫”,3);

animal是父类类型,但可以引用一个子类对象,因为是从小范围向大范围的转换。

使用场景:

  1. 直接赋值
  2. 方法传参
  3. 方法返回

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

向下转型

向下转型:将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的方法,此时:将父类引用再还原为子类对象即可,即向下转型。
在这里插入图片描述
向下转型用的比较少,而且不安全,万一转型失败,运行时就会抛异常。Java中为了提高向下转型的安全性,引入了instanceof,如果该表达式为true,则可以安全转换。

多态的优缺点

优点:

  1. 能够降低代码的“圈复杂度”,避免使用大量的if-else

圈复杂度:圈复杂度是一种描述一段代码复杂程度的方式,一段代码如果平铺直叙,那么就比较简单容易理解,而如果有很多的条件分支或者循环语句,就认为理解起来更复杂
因此我们可以简单粗暴的计算一段代码中条件语句和循环语句出现的个数,这个个数就称为“圈复杂度”如果一个方法的圈复杂度太高,就需要考虑重构。

  1. 可扩展能力更强

缺点:
多态缺陷:代码的运行效率降低

  1. 属性没有多态性
    当父类和子类都有同名属性的时候,通过父类引用,只能引用父类自己的成员属性
  2. 构造方法没有多态性

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

米贸搜|Facebook新手请查收!如何在FB上定位到B类受众?

一、确定目标受众和营销目标 在利用Facebook进行获客之前,B2B企业需要首先明确目标受众和营销目标。目标受众是指潜在的客户或合作伙伴,而营销目标可能是增加销量、提高品牌知名度、获取客户线索等。 Facebook的受众定位可以分成三大类:人口…

Netty通信中的粘包半包问题(五)

这期我们来分析下消息头消息体的这种方式来实现完美的解决方案,当然这也是最复杂的一种实现,因为在大多数场景中,性能和复杂度始终不能兼得。代码中使用了MessagePack的第三方序列化,因为我们要传输的实体类对象在客户端和服务端之…

从matlab的fig图像文件中提取数据

这里用的是openfig()函数打开的fig文件 →→→【matlab 中 fig 数据提取】 很简洁 →→→【MATLAB提取 .fig 文件中的数据】 这个给出了包含多个曲线的情况 →→→【提取matlab fig文件里的数据和legend】 chatgpt给出的方法 打开fig文件并保存数据 我的…

Git 基本命令与操作流

记录 Git 中的基本命令和创建仓库、提交文件、删除文件等方面的操作 Git 基本命令 git status:查看状态 nothing to commit, working directory clean:所有已跟踪文件在上次提交后都未被更改过,或者说当前目录下没有出现任何处于未跟踪状态…

Java 类与对象(对象的分配机制、对象的创建过程、匿名对象)

面向对象 面向对象编程(Object-Oriented Programming 简称 OOP)是一种程序设计思想和编码架构。 Java 是完全面向对象的, 必须熟悉 OOP 才能够编写 Java 程序。 面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能…

基于springboot+vue的蜗牛兼职网的设计与实现系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

力扣每日一练(24-1-18)

经验一:不要把问题想复杂 Python: min_price float(inf)max_profit 0for price in prices:min_price min(min_price, price)max_profit max(max_profit, price - min_price)return max_profit C#: public int MaxProfit(int[] prices) {i…

GNU Radio简介及流程图搭建

文章目录 前言一、GNU Radio 是什么?二、GNU Radio 安装三、搭建第一个流程图1、创建 GRC 文件2、添加块3、运行流程图 前言 欢迎来到无线通信的世界,初步接触 GNU Radio,对其学习进行一个记录。 一、GNU Radio 是什么? GNU Rad…

【重点!!!】【背包】【回溯】518.零钱兑换II

题目 跟39.组合总数、322.零钱兑换题目很类似。 法1:背包DP,最优解法 解释如下: 0 1 2 3 4 5(背包容量)1 0 0 0 0 0 没有硬币的时候) 0 1 2 3 4 5(背包容量) 1 1 1 1 1 1 1 0 1 2 3 4 5(背包容量) 1 …

深入解析 Java 方法引用:Lambda 表达式的进化之路

前言 方法引用是 Java 8 提供的一种新特性,它允许我们更简洁地传递现有方法作为参数。这项特性实际上是对 Lambda 表达式的一种补充,通过方法引用,我们可以直接引用现有方法,而无需编写完整的Lambda表达式。最近在使用方法引用的…

Spring(19) ThreadPoolTaskExecutor 线程池的使用

目录 一、线程池简介1.1 为什么使用线程池1.2 线程池为什么需要使用队列1.3 线程池为什么要使用阻塞队列而不是用非阻塞队列1.4 如何配置线程池1.5 execute() 和 submit() 方法 二、ThreadPoolTaskExecutor 线程池简介2.1 简介2.2 核心参数配置2.3 ThreadPoolTaskExecutor 内部…

TortoiseSVN客户端如何安装配置并实现公网访问服务端提交文件到本地服务器

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统,它与Apache Subversion(SVN)集成在一起,提供了一个用户友好的界面,方便用…

CSV文件中json列的处理2

如上所示,csv文件中包含以中括号{}包含的json字段,可用如下方法提取: import pandas as pd from datetime import date todaystr(date.today()) import jsonfilepath/Users/kangyongqing/Documents/kangyq/202401/调课功能使用统计/ file104…

顶顶通呼叫中心中间件如何实现自己呼叫自己并且放音:一步步配置(mod_cti基于FreeSWITCH)

介绍 顶顶通呼叫中心中间件如何实现自己呼叫自己并且放音:一步步配置 一、配置acl.conf 打开ccadmin-》点击配置文件并且打开acl.conf-》配置好了点击提交XML。 注意:acl.conf的服务器IP必须是内网IP 添加了之后在运维调试输入reloadacl 在运维调试执…

对象存储, 开源MinIO docker-compose.yml 文件

文章目录 python SDK 文档地址:docker-compose.yml 文件控制台使用:应用服务中使用样例: python SDK 文档地址: https://min.io/docs/minio/linux/developers/python/API.html docker-compose.yml 文件 version: 3services:min…

优化微信小程序更新体验:异步更新与强制更新方案解析

在微信小程序的开发和迭代过程中,新版本覆盖率的问题一直备受关注。由于小程序采用异步更新机制,在用户首次打开或冷启动时才会检查并下载新版本,导致部分用户无法及时应用上最新版本。为了解决这一问题,微信团队经过深入研究和讨…

Prometheus 监控容器

容器监控:cAdvisor Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux/Windows/Mac机器上。容器镜像正成为一个新的标准化软件交付方式。 例如,可以通过以下…

NebulaGraph7 种查询(关键词、向量、混合检索),Graph RAG 探索知识图谱

NebulaGraph7 种查询(关键词、向量、混合检索),Graph RAG 探索知识图谱 1.架构思路 如果你熟悉知识图谱和图数据库 NebulaGraph,可以直接跳到 “RAG 具体实现” 章节。如果你不熟悉 NebulaGraph,请继续往下读。 什么…

INS-06003错误处理

在麒麟V10操作系统上安装Oracle RAC 19C,安装GI的建立互信步骤中,遇到INS-06003错误: [INS-06003] Failed to setup password SSH connectivity with following node(s) 查看详细信息: PRVG-11001: PRCZ-2136: PRCZ-2006: 此时在操…

链动2+1模式:月流水6000万是怎么做到的?

一个好的企业往往只需要最简单的营销方式。当我们面对当今的商业市场,琳琅满目的商业模式,应接不暇的营销方案,我们一定会举足无措的不知道怎么选择。因为一个好的公司或企业,一定要有一个十分经得起推敲的模式来面对消费者。 那么…
最新文章