当前位置: 首页 > news >正文

方法重写与方法重载

1. 方法重载与方法重写的定义

方法重写(Overriding)

方法重写(Overriding)是指在子类中重新定义与父类中相同的方法。此操作允许子类提供特定的实现,以替代父类的实现。方法重写是实现多态性(Polymorphism)的关键机制。

方法重载(Overloading)

方法重载是指在同一类中使用相同的方法名,但不同的参数列表(参数数量或参数类型)。方法重载允许一个类中多个方法的存在,具有相同的功能但不同的输入。

2. 方法重写与方法重载的实现规则

方法重写(Overriding)

实现方法重写时,需要遵循以下几条规则:

  • 方法名和参数列表相同:子类中的重写方法必须与父类中的方法一致。

  • 返回类型相同或兼容:返回类型可以与父类相同,或者是父类返回类型的子类。

  • 访问修饰符:子类重写的方法的访问修饰符必须与父类的方法相同或更具可见性(如protected可以被重写为public)。

  • 不能重写静态方法:静态方法不能被重写,实际调用根据引用类型决定。

  • 不能重写final方法:如果父类的方法被标记为final,则不能在子类中重写。

方法重载(Overloading)

实现方法重载时,可以遵循以下规则:

  • 方法名相同:重载的方法必须使用相同的方法名。

  • 参数列表不同:参数数量或参数类型必须不同,以便区分不同的重载方法。

  • 返回类型可以不同:重载的方法可以有不同的返回类型,但唯一的区分依然是参数列表。

3. 示例代码

方法重写示例

class Animal {void sound() {System.out.println("Animal makes a sound");}
}class Dog extends Animal {@Overridevoid sound() {System.out.println("Dog barks");}
}

方法重载示例

class MathUtils {// 方法重载int add(int a, int b) {return a + b;}double add(double a, double b) {return a + b;}int add(int a, int b, int c) {return a + b + c;}
}

在重载示例中,MathUtils类具有多个名为add的方法,这些方法具有不同的参数列表。

4. 方法重写与方法重载的对比

特性方法重写(Overriding)方法重载(Overloading)
定义子类中重新定义与父类相同的方法同一类中使用相同的方法名,但参数列表不同
目的实现多态性,使子类可以提供特定实现提高代码可读性,允许同一方法名处理不同类型或数量的参数
参数列表必须相同可以不同
返回类型必须相同或兼容可以不同
访问修饰符子类方法的访问修饰符可以更宽松不适用,访问修饰符无关紧要

其他编程语言中的方法重写与方法重载

C++

在C++中,方法重写和方法重载的实现相对简单。

方法重载

在C++中,可以通过定义相同名称但具有不同参数的函数来实现方法重载。关键词没有专门的关键字。

#include <iostream>
using namespace std;class MathUtils {
public:// 方法重载int add(int a, int b) {return a + b;}double add(double a, double b) {return a + b;}int add(int a, int b, int c) {return a + b + c;}
};int main() {MathUtils math;cout << math.add(5, 10) << endl;      // 输出: 15cout << math.add(5.5, 4.5) << endl;   // 输出: 10cout << math.add(1, 2, 3) << endl;     // 输出: 6return 0;
}
方法重写

在C++中,方法重写需要使用virtual关键字标记基类中的方法,以及override关键字来标记派生类中的重写。

#include <iostream>
using namespace std;class Animal {
public:virtual void sound() { // 使用virtual实现方法重写cout << "Animal makes a sound" << endl;}
};class Dog : public Animal {
public:void sound() override { // 使用override实现重写cout << "Dog barks" << endl;}
};int main() {Animal* animal = new Dog();animal->sound(); // 输出: Dog barksdelete animal;return 0;
}

Python

在Python中,方法重载并不是内置的,但可以通过默认参数实现。方法重写是通过定义相同名称的方法实现的。

方法重载

Python不使用专门的重载机制,可以使用默认参数实现类似效果。

class MathUtils:def add(self, a, b, c=0):  # 使用可选参数实现重载return a + b + cmath = MathUtils()
print(math.add(5, 10))       # 输出: 15
print(math.add(5, 10, 2))    # 输出: 17
方法重写

在Python中,方法重写只需定义相同名称的方法。

class Animal:def sound(self):print("Animal makes a sound")class Dog(Animal):def sound(self):  # 重写父类方法print("Dog barks")animal = Dog()
animal.sound()  # 输出: Dog barks

JavaScript

在JavaScript中,方法重载不被直接支持,但可以通过对象属性的方式实现。方法重写通过原型继承机制实现。

方法重载

可以通过实现一个函数并检查参数的类型,来模拟方法重载。

class MathUtils {add(a, b, c) {if (typeof c === 'undefined') {return a + b;} else {return a + b + c;}}
}const math = new MathUtils();
console.log(math.add(5, 10));      // 输出: 15
console.log(math.add(5, 10, 2));   // 输出: 17
方法重写

JavaScript使用原型链来实现方法重写。

class Animal {sound() {console.log("Animal makes a sound");}
}class Dog extends Animal {sound() { // 重写父类方法console.log("Dog barks");}
}const animal = new Dog();
animal.sound();  // 输出: Dog barks

5.方法重写与重载的总结表格

表格 1: 方法重写对比

编程语言实现方式关键字/语法
Java子类重写父类方法@Override
C++使用virtualoverridevirtual / override
Python定义相同名称的方法无特别关键字
JavaScript通过类继承进行重写无特别关键字

表格 2: 方法重载对比

编程语言实现方式关键字/语法
Java相同方法名不同参数
C++相同方法名不同参数
Python使用默认参数无特别关键字
JavaScript根据参数类型检查实现重载无特别关键字

6. 体现的编程思维

方法重写(Overriding)

1. 多态性

多态性是面向对象编程的一个核心概念。方法重写允许父类引用指向子类对象,这样在运行时可以调用子类的实现。例如,当我们创建一个Animal类型的引用,并让它指向一个Dog对象时,调用sound方法时实际上会执行Dog类中的sound实现,而不是Animal类中的实现。这种能力让开发者能够编写更加灵活和可扩展的代码,因为可以随时替换或扩展子类,而无需修改其他依赖于父类引用的代码。

2. 代码重用

方法重写促进了代码重用。通过继承,子类可以直接获取父类的属性和方法,在这基础上添加或修改具体的实现。这种方式减少了代码重复,在多个子类中共享通用逻辑,同时也确保了在父类修改时,所有子类的实现都能保持一致。例如,如果父类有一个通用的move方法,所有子类都可以重用这个方法,而不需要在每个类中重新实现。

3. 抽象化

抽象化是OOP的基本原则之一,通过方法重写,父类可以定义一个接口或抽象方法,让子类实现具体的行为。此时,父类提供统一的调用方式,而子类则负责具体的实现。这种机制使得代码更加灵活,增加了系统的可扩展性。例如,可以定义一个Shape类,其中有一个draw方法,所有形状的子类如CircleSquare都可以定义自己的draw实现,从而使得Shape类的使用者无须了解具体的实现细节,只需关注接口的使用。

4. 易于理解和维护

方法重写的结构通常比方法的不同实现更加清晰,通过定义父类的抽象或接口,子类的责任和行为可以非常明确。清晰的层次结构使得代码的可读性增强,维护变得更为简单。一旦发现bug或需要添加新功能,只需在子类中修改或扩展相应的方法。这种结构化设计降低了系统的复杂性,使得程序的逻辑结构更加清晰,有助于团体协作与项目的长远发展。

方法重载(Overloading)

方法重载强调的是同一方法名的多样性,通过不同的参数列表,使得一个方法可以处理不同类型或数量的输入。这种设计思维体现在以下几个方面:

1. 可读性与表达性

方法重载提高了代码的可读性表达性。当多个相关操作使用相同的方法名时,阅读者可以快速理解这些方法之间的关系。例如,在数学计算中,add方法可以用于处理不同类型(整型、浮点型)的加法操作,避免了使用不同的名字来描述相似功能的方法。

2. 便捷性

重载可以使得代码更加便捷,程序员可以使用相同的功能调用,而不需要记住多个方法名。这在大多数情况下让代码更加紧凑,同时也易于在调用时传递参数,这些参数可能具有不同的数据类型或不同的数量。

3. 灵活性

方法重载为程序提供了灵活性,允许同一个功能以多种方式实现。在大型项目中,开发者可以根据不同的业务需求,提供多种操作接口。例如,考虑一个图形编辑器,用户可能需要绘制不同形状的方法,重载draw方法来处理不同的参数(如形状对象或具体坐标),能够灵活满足用户的需求。

4. 维护和扩展

使用方法重载可以使得程序在维护和扩展方面具有更多的选择。例如,假设需要实现一个新的add方法来处理复杂的数值对象。通过重载,而非替换原有方法,开发者可以轻松添加新功能,保持旧功能不变,从而不影响现有的代码逻辑和运行性能。

相关文章:

方法重写与方法重载

1. 方法重载与方法重写的定义 方法重写&#xff08;Overriding&#xff09; 方法重写&#xff08;Overriding&#xff09;是指在子类中重新定义与父类中相同的方法。此操作允许子类提供特定的实现&#xff0c;以替代父类的实现。方法重写是实现多态性&#xff08;Polymorphis…...

Vue3实现地球上加载柱体

最终效果为上图。 实现该技术&#xff0c;需要一些技术&#xff0c;我分别罗列一下&#xff1a; canvas&#xff1a;需要使用canvas根据json来绘制地球&#xff0c;不懂的可以看这篇canvas绘制地球 threejs&#xff1a;需要会使用threejs&#xff0c;这里并没有使用shader&am…...

OpenGL入门003——使用Factory设计模式简化渲染流程

前面两节已经学会了如何使用opengl创建窗口并绘制三角形&#xff0c;我们可以看出有些步骤是固定的&#xff0c;而且都写在main.cpp&#xff0c;这一节我们将了解如何使用Factroy设计模型。将模型渲染逻辑封装在一个单独的类中&#xff0c;简化开发流程&#xff0c;且提高代码复…...

01_AI编程案例展示:借助AI轻松爬取海量网盘链接

爬虫案例展示 今天,我们将展示如何利用AI快速开发一个网络爬虫&#xff0c; 使用的工具是Python和Claude 3.5 Sonnet(国内可用豆包替代) 我们的目标是爬取panhub.fun网站上的夸克网盘链接, 即使你是编程新手,也可以轻松完成这样的任务。 案例1-批量爬取panhub网盘整合包 下…...

【机器学习导引】ch5-神经网络

Q&A 1x1 卷积层在深度学习中的作用&#xff1f; 1x1 卷积层在深度学习中具有几个重要的作用&#xff1a; 通道压缩&#xff1a;1x1卷积可以通过调整输出通道数来减少特征图的深度&#xff0c;从而降低计算成本和参数数量。这有助于在保持特征的情况下简化模型。特征融合&am…...

【Axure原型分享】颜色选择器——填充颜色

今天和大家分享颜色选择器——填充颜色的原型模板&#xff0c;点击颜色区域可以弹出颜色选择器&#xff0c;点击可以选择对应颜色&#xff0c;颜色区域会变色我们选择的颜色&#xff0c;具体效果可以观看下方视频或者打开预览地址体验。 【原型效果】 【Axure高保真原型】颜色…...

怎么安装行星减速电机才是正确的

行星减速电机由于其高效、精密的传动能力&#xff0c;广泛应用于自动化设备、机器人、机床以及其他需要精准控制的领域。正确的安装行星减速电机对于确保设备的性能与延长使用寿命至关重要。 一、前期准备 在进行行星减速电机的安装之前&#xff0c;必须做好充分的前期准备工作…...

Unity程序化生成地形

制作地形&#xff1a; 绘制方块逐个绘制方块并加噪波高度删除Gizmos和逐个绘制 1.draw quad using System.Collections; using System.Collections.Generic; using UnityEngine;[RequireComponent(typeof(MeshFilter))] public class mesh_generator : MonoBehaviour {Mesh m…...

Vxe UI vue vxe-table 表格中使用下拉表格,单元格渲染下拉表格

Vxe UI vue vxe-table 表格中使用下拉表格&#xff0c;单元格渲染下拉表格 单元格中渲染下拉表格&#xff0c;需要使用到 vxe-table-select 这个组件&#xff0c;在 vxe-table 4.7 中使用非常简单&#xff0c;只需要配置好渲染器数据源就可以。 支持单选 也可以多选 代码 …...

Android开发教程实加载中...动效

Android开发教程实加载中…动效 加载中&#xff0c;发送中&#xff0c;匹配中都可以用&#xff0c;就是后面是三个点还是两个点&#xff0c;不断在切换 一、思路&#xff1a; 隔500ms发送一次&#xff0c;改变内容 二、效果图&#xff1a; 看视频更加直观点&#xff1a; An…...

NVR设备ONVIF接入平台EasyCVR视频融合平台智慧小区视频监控系统建设方案

一、方案背景 智慧小区构成了“平安城市”建设的基石。随着社会的进步&#xff0c;社区安全问题逐渐成为公众关注的热点。诸如高空抛物、乱丢垃圾、破坏车辆、入室盗窃等不文明行为和违法行为频繁出现。目前&#xff0c;许多小区的物业管理和安全防护系统仍然较为简单和陈旧&a…...

适配器模式适用的场景

适配器模式是一种常用的设计模式&#xff0c;能够将不兼容的接口转换为客户端所需的接口。在实际开发中&#xff0c;我们常常会遇到需要统一接口、替换外部系统、兼容旧接口或适配不同数据格式的情况。本文将结合详细的代码示例&#xff0c;介绍适配器模式的适用场景。 1. 统一…...

Ambari里面添加hive组件

1.创建hive数据库 在添加hive组件之前需要做的事情&#xff0c;先在master这个虚拟机里面创建好hive 先进入虚拟机里面进入mysql 然后输入这个命令看看有没有自己创建的hive数据库 show databases;有的话会显示下面这个样子 没有的同学使用以下命令可以在MySQL中创建hive数…...

Windows部署rabbitmq

本次安装环境&#xff1a; 系统&#xff1a;Windows 11 软件建议版本&#xff1a; erlang OPT 26.0.2rabbitmq 3.12.4 一、下载 1.1 下载erlang 官网下载地址&#xff1a; 1.2 下载rabbitmq 官网下载地址&#xff1a; 建议使用解压版&#xff0c;安装版可能会在安装软件…...

【Flask】四、flask连接并操作数据库

目录 前言 一、 安装必要的库 二、配置数据库连接 三、定义模型 四、操作数据库 1.添加用户 2.删除用户 3.更新用户信息 4查询所有用户 五、测试结果 前言 在Flask框架中&#xff0c;数据库的操作是一个核心功能&#xff0c;它允许开发者与后端数据库进行交互&#xf…...

ES跟Kafka集成

配合流程 1. Kafka作为分布式流处理平台&#xff0c;能够实时收集和处理不同数据源的数据流&#xff1b; 2. 通过Kafka Connect或者Logstash等中间件&#xff0c;可以将Kafka中的数据流实时推送到Elasticsearch中&#xff1b; 3. Elasticsearch接收到数据后&#xff0c;会根据…...

Python Matplotlib:基本图表绘制指南

Python Matplotlib&#xff1a;基本图表绘制指南 Matplotlib 是 Python 中一个非常流行的绘图库&#xff0c;它以简单易用和功能丰富而闻名&#xff0c;适合各种场景的数据可视化需求。在数据分析和数据科学领域&#xff0c;Matplotlib 是我们展示数据的有力工具。本文将详细讲…...

供应商图纸外发:如何做到既安全又高效?

供应商跟合作伙伴、客户之间会涉及到图纸外发的场景&#xff0c;这是一个涉及数据安全、效率及合规性的重要环节。供应商图纸发送流程一般如下&#xff1a; 1.申请与审批 采购人员根据需要提出发放图纸的申请并提交审批&#xff1b; 采购部负责人审批发放申请&#xff0c;确…...

探索 Move 编程语言:智能合约开发的新纪元

目录 引言 一、变量的定义 二、整型 如何在Move中表示小数和负数&#xff1f; 三、运算符 as运算符 布尔型 地址类型 四、什么是包&#xff1f; 五、什么是模块&#xff1f; 六、如何定义方法&#xff1f; 方法访问权限控制 init方法 总结 引言 Move 是一种专为区…...

vue3+vant实现视频播放(含首次禁止进度条拖拽,视频看完后恢复,保存播放视频进度,刷新及下次进入继续播放,判断视频有无全部看完等)

1、效果图 2、 <div><videocontrolsclass"video_player"ref"videoPlayer":src"videoSrc"timeupdate"handleTimeUpdate"play"onPlay"pause"onPause"ended"onVideoEnded"></video><…...

LaTeX documentclass命令深度解析:从基础语法到高级定制

1. LaTeX documentclass命令入门指南 第一次接触LaTeX时&#xff0c;我盯着那个神秘的\documentclass命令发呆了半小时。这个看似简单的命令&#xff0c;实际上掌控着整个文档的"基因"。就像盖房子前要确定是建公寓楼还是独栋别墅&#xff0c;documentclass决定了文档…...

我用豆包写的论文 AI 率为什么 95%?这款工具一次降到 4% 万方检测合格

我用豆包写的论文 AI 率为什么 95%&#xff1f;这款工具一次降到 4% 万方检测合格 去年我用豆包写了 1 万字的生物学本科论文——自己读着挺顺、像人写的。送学校万方 AIGC 检测——AI 率 95.7%&#xff0c;学校卡的是 30%。我整个人懵了。 这篇文章我把当时的实测过程写下来—…...

3步掌握Windows 11任务栏自定义神器:Taskbar11完全指南

3步掌握Windows 11任务栏自定义神器&#xff1a;Taskbar11完全指南 【免费下载链接】Taskbar11 Change the position and size of the Taskbar in Windows 11 项目地址: https://gitcode.com/gh_mirrors/ta/Taskbar11 还在为Windows 11僵化的任务栏设置而烦恼吗&#xf…...

PCIe调试避坑指南:当你的设备报Malformed TLP/UR/UC错误时,到底发生了什么?

PCIe调试实战&#xff1a;Malformed TLP/UR/UC错误排查全解析 当PCIe设备突然抛出Malformed TLP、UR&#xff08;Unsupported Request&#xff09;或UC&#xff08;Unexpected Completion&#xff09;错误时&#xff0c;很多工程师的第一反应往往是翻查协议手册。但真实调试场景…...

别再踩坑了!Vue2项目里用Swiper5.4.5做轮播,这几个配置项(observer/observeParents)不加真不行

Vue2项目中Swiper5.4.5轮播图动态适配避坑指南 轮播图作为现代Web应用中最常见的交互组件之一&#xff0c;几乎成为每个前端项目的标配。在Vue2生态中&#xff0c;Swiper凭借其丰富的功能和灵活的配置&#xff0c;成为开发者实现轮播效果的首选库。然而&#xff0c;许多初中级开…...

新手入门教程使用Python快速调用Taotoken提供的多模型API服务

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 新手入门教程使用Python快速调用Taotoken提供的多模型API服务 对于刚开始接触大模型API的开发者而言&#xff0c;直接对接不同厂商…...

万维网免费开放30年:除了浏览器,我们还能从CERN的决策中学到什么开源哲学?

万维网开源决策的启示&#xff1a;从技术公共性到开发者行动指南 1993年4月30日&#xff0c;欧洲核子研究中心&#xff08;CERN&#xff09;宣布将万维网技术置于公共领域&#xff0c;这一决定彻底改变了人类获取信息的方式。当我们回溯这个历史性时刻&#xff0c;会发现它远不…...

面试官最爱阴人的滑动窗口题,为啥你总是写崩?

面试官最爱阴人的滑动窗口题,为啥你总是写崩? 很多人刷算法的时候,都有一种错觉: 动态规划最难。 图论最恶心。 回溯最容易超时。 结果真正到了大厂面试现场。 面试官笑眯眯来一句: 给你一个字符串,求: 至多包含 K 个不同字符的最长子串然后。 一堆人开始原地去世…...

Windows与Office激活神器:KMS_VL_ALL_AIO使用全攻略

Windows与Office激活神器&#xff1a;KMS_VL_ALL_AIO使用全攻略 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows和Office的激活问题头疼吗&#xff1f;每次看到那个烦人的"激…...

别再乱改驱动了!手把手教你为RV1126的7寸MIPI屏生成正确的GT911配置文件

RV1126开发实战&#xff1a;GT911触摸屏配置文件的深度解析与精准调试 在嵌入式开发中&#xff0c;触摸屏调试往往是一个令人头疼的问题。特别是当遇到坐标不准、跳点或方向错误时&#xff0c;很多开发者第一反应就是修改驱动代码中的方向参数。然而&#xff0c;这种"头痛…...