方法重写与方法重载
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++ | 使用virtual 和override | virtual / override |
Python | 定义相同名称的方法 | 无特别关键字 |
JavaScript | 通过类继承进行重写 | 无特别关键字 |
表格 2: 方法重载对比
编程语言 | 实现方式 | 关键字/语法 |
---|---|---|
Java | 相同方法名不同参数 | 无 |
C++ | 相同方法名不同参数 | 无 |
Python | 使用默认参数 | 无特别关键字 |
JavaScript | 根据参数类型检查实现重载 | 无特别关键字 |
6. 体现的编程思维
方法重写(Overriding)
1. 多态性
多态性是面向对象编程的一个核心概念。方法重写允许父类引用指向子类对象,这样在运行时可以调用子类的实现。例如,当我们创建一个Animal
类型的引用,并让它指向一个Dog
对象时,调用sound
方法时实际上会执行Dog
类中的sound
实现,而不是Animal
类中的实现。这种能力让开发者能够编写更加灵活和可扩展的代码,因为可以随时替换或扩展子类,而无需修改其他依赖于父类引用的代码。
2. 代码重用
方法重写促进了代码重用。通过继承,子类可以直接获取父类的属性和方法,在这基础上添加或修改具体的实现。这种方式减少了代码重复,在多个子类中共享通用逻辑,同时也确保了在父类修改时,所有子类的实现都能保持一致。例如,如果父类有一个通用的move
方法,所有子类都可以重用这个方法,而不需要在每个类中重新实现。
3. 抽象化
抽象化是OOP的基本原则之一,通过方法重写,父类可以定义一个接口或抽象方法,让子类实现具体的行为。此时,父类提供统一的调用方式,而子类则负责具体的实现。这种机制使得代码更加灵活,增加了系统的可扩展性。例如,可以定义一个Shape
类,其中有一个draw
方法,所有形状的子类如Circle
、Square
都可以定义自己的draw
实现,从而使得Shape
类的使用者无须了解具体的实现细节,只需关注接口的使用。
4. 易于理解和维护
方法重写的结构通常比方法的不同实现更加清晰,通过定义父类的抽象或接口,子类的责任和行为可以非常明确。清晰的层次结构使得代码的可读性增强,维护变得更为简单。一旦发现bug或需要添加新功能,只需在子类中修改或扩展相应的方法。这种结构化设计降低了系统的复杂性,使得程序的逻辑结构更加清晰,有助于团体协作与项目的长远发展。
方法重载(Overloading)
方法重载强调的是同一方法名的多样性,通过不同的参数列表,使得一个方法可以处理不同类型或数量的输入。这种设计思维体现在以下几个方面:
1. 可读性与表达性
方法重载提高了代码的可读性和表达性。当多个相关操作使用相同的方法名时,阅读者可以快速理解这些方法之间的关系。例如,在数学计算中,add
方法可以用于处理不同类型(整型、浮点型)的加法操作,避免了使用不同的名字来描述相似功能的方法。
2. 便捷性
重载可以使得代码更加便捷,程序员可以使用相同的功能调用,而不需要记住多个方法名。这在大多数情况下让代码更加紧凑,同时也易于在调用时传递参数,这些参数可能具有不同的数据类型或不同的数量。
3. 灵活性
方法重载为程序提供了灵活性,允许同一个功能以多种方式实现。在大型项目中,开发者可以根据不同的业务需求,提供多种操作接口。例如,考虑一个图形编辑器,用户可能需要绘制不同形状的方法,重载draw
方法来处理不同的参数(如形状对象或具体坐标),能够灵活满足用户的需求。
4. 维护和扩展
使用方法重载可以使得程序在维护和扩展方面具有更多的选择。例如,假设需要实现一个新的add
方法来处理复杂的数值对象。通过重载,而非替换原有方法,开发者可以轻松添加新功能,保持旧功能不变,从而不影响现有的代码逻辑和运行性能。
相关文章:
方法重写与方法重载
1. 方法重载与方法重写的定义 方法重写(Overriding) 方法重写(Overriding)是指在子类中重新定义与父类中相同的方法。此操作允许子类提供特定的实现,以替代父类的实现。方法重写是实现多态性(Polymorphis…...

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

OpenGL入门003——使用Factory设计模式简化渲染流程
前面两节已经学会了如何使用opengl创建窗口并绘制三角形,我们可以看出有些步骤是固定的,而且都写在main.cpp,这一节我们将了解如何使用Factroy设计模型。将模型渲染逻辑封装在一个单独的类中,简化开发流程,且提高代码复…...
01_AI编程案例展示:借助AI轻松爬取海量网盘链接
爬虫案例展示 今天,我们将展示如何利用AI快速开发一个网络爬虫, 使用的工具是Python和Claude 3.5 Sonnet(国内可用豆包替代) 我们的目标是爬取panhub.fun网站上的夸克网盘链接, 即使你是编程新手,也可以轻松完成这样的任务。 案例1-批量爬取panhub网盘整合包 下…...

【机器学习导引】ch5-神经网络
Q&A 1x1 卷积层在深度学习中的作用? 1x1 卷积层在深度学习中具有几个重要的作用: 通道压缩:1x1卷积可以通过调整输出通道数来减少特征图的深度,从而降低计算成本和参数数量。这有助于在保持特征的情况下简化模型。特征融合&am…...

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

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

Unity程序化生成地形
制作地形: 绘制方块逐个绘制方块并加噪波高度删除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 表格中使用下拉表格,单元格渲染下拉表格 单元格中渲染下拉表格,需要使用到 vxe-table-select 这个组件,在 vxe-table 4.7 中使用非常简单,只需要配置好渲染器数据源就可以。 支持单选 也可以多选 代码 …...

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

NVR设备ONVIF接入平台EasyCVR视频融合平台智慧小区视频监控系统建设方案
一、方案背景 智慧小区构成了“平安城市”建设的基石。随着社会的进步,社区安全问题逐渐成为公众关注的热点。诸如高空抛物、乱丢垃圾、破坏车辆、入室盗窃等不文明行为和违法行为频繁出现。目前,许多小区的物业管理和安全防护系统仍然较为简单和陈旧&a…...
适配器模式适用的场景
适配器模式是一种常用的设计模式,能够将不兼容的接口转换为客户端所需的接口。在实际开发中,我们常常会遇到需要统一接口、替换外部系统、兼容旧接口或适配不同数据格式的情况。本文将结合详细的代码示例,介绍适配器模式的适用场景。 1. 统一…...

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

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

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

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

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

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

探索 Move 编程语言:智能合约开发的新纪元
目录 引言 一、变量的定义 二、整型 如何在Move中表示小数和负数? 三、运算符 as运算符 布尔型 地址类型 四、什么是包? 五、什么是模块? 六、如何定义方法? 方法访问权限控制 init方法 总结 引言 Move 是一种专为区…...

vue3+vant实现视频播放(含首次禁止进度条拖拽,视频看完后恢复,保存播放视频进度,刷新及下次进入继续播放,判断视频有无全部看完等)
1、效果图 2、 <div><videocontrolsclass"video_player"ref"videoPlayer":src"videoSrc"timeupdate"handleTimeUpdate"play"onPlay"pause"onPause"ended"onVideoEnded"></video><…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...