【Java基础-26.1】Java中的方法重载与方法重写:区别与使用场景

在Java的面向对象编程中,方法重载(Overloading)方法重写(Overriding)是两个非常重要的概念。它们虽然名字相似,但在使用场景、规则和功能上有显著的区别。理解这两者的差异,对于编写高效、可维护的代码至关重要。本文将深入探讨方法重载和方法重写的定义、区别以及实际应用场景,帮助你更好地掌握它们。


1. 方法重载(Overloading)

1.1 定义

方法重载是指在同一个类中定义多个方法,这些方法具有相同的名称但不同的参数列表。参数列表的不同可以体现在参数的数量、类型或顺序上。

1.2 特点

  1. 发生在同一个类中
  2. 方法名相同,参数列表不同
  3. 返回类型可以相同也可以不同(但不能仅通过返回类型区分重载)。
  4. 与访问修饰符无关(可以是publicprivate等)。
  5. 可以抛出不同的异常

1.3 示例

public class Calculator {// 方法1:两个整数相加public int add(int a, int b) {return a + b;}// 方法2:三个整数相加(参数数量不同)public int add(int a, int b, int c) {return a + b + c;}// 方法3:两个浮点数相加(参数类型不同)public double add(double a, double b) {return a + b;}
}

1.4 使用场景

  • 处理不同类型的数据。
  • 提供多种参数组合的方法调用。
  • 简化API设计,使代码更易读。

方法重载可以详细参考:Java中的方法重载:提升代码灵活性与可读性


2. 方法重写(Overriding)

2.1 定义

方法重写是指子类重新定义父类中已有的方法。重写的方法必须具有相同的方法名、参数列表和返回类型。

2.2 特点

  1. 发生在子类和父类之间
  2. 方法名、参数列表和返回类型必须相同
  3. 访问修饰符不能比父类方法更严格(例如,父类方法是protected,子类方法可以是public,但不能是private)。
  4. 不能重写finalstaticprivate方法
  5. 可以抛出与父类方法相同或不抛出异常,但不能抛出更宽泛的异常

2.3 示例

class Animal {public void makeSound() {System.out.println("Animal makes a sound");}
}class Dog extends Animal {// 方法重写@Overridepublic void makeSound() {System.out.println("Dog barks");}
}

2.4 使用场景

  • 修改或扩展父类方法的行为。
  • 实现多态性,使子类可以根据需要定义自己的逻辑。
  • 增强代码的灵活性和可扩展性。

方法重写可以详细参考:Java中的方法重写:深入解析与最佳实践


3. 方法重载与方法重写的区别

特性方法重载(Overloading)方法重写(Overriding)
发生位置同一个类中子类和父类之间
方法名相同相同
参数列表必须不同必须相同
返回类型可以不同必须相同
访问修饰符无限制不能比父类方法更严格
异常抛出可以不同不能抛出更宽泛的异常
绑定机制编译时绑定(静态绑定)运行时绑定(动态绑定)
适用场景处理不同类型或数量的参数修改或扩展父类方法的行为

4. 实际应用场景

4.1 方法重载的应用

  1. 处理多种数据类型:例如,Java标准库中的System.out.println方法可以接受intStringdouble等多种类型的参数。

  2. 提供默认参数:通过重载模拟默认参数的功能。

    public void greet() {greet("World"); // 调用另一个重载方法
    }public void greet(String name) {System.out.println("Hello, " + name + "!");
    }
    

4.2 方法重写的应用

  1. 实现多态性:通过重写父类方法,子类可以根据需要定义自己的行为。

    Animal myDog = new Dog();
    myDog.makeSound(); // 输出 "Dog barks"
    
  2. 扩展父类功能:在子类中添加额外的逻辑,同时保留父类的核心功能。

    @Override
    public void makeSound() {super.makeSound(); // 调用父类方法System.out.println("Additional sound logic");
    }
    

5. 常见问题与注意事项

5.1 方法重载

  • 不能仅通过返回类型区分重载:Java编译器无法仅根据返回类型来区分方法。
  • 避免过度重载:过多的重载方法可能会使代码难以维护。

5.2 方法重写

  • 不能重写final方法final方法不能被重写。
  • 不能重写static方法static方法属于类,而不是实例,因此不能被重写。
  • 遵循Liskov替换原则:子类方法的行为应与父类方法一致,避免破坏程序的正确性。

6. 总结

方法重载和方法重写是Java中实现代码复用和多态性的重要手段。虽然它们都涉及同名方法,但在使用场景和规则上有显著的区别:

  • 方法重载用于在同一个类中提供多个功能相似但参数不同的方法,增强代码的灵活性。
  • 方法重写用于在子类中修改或扩展父类方法的行为,实现多态性。

理解并正确使用这两种特性,可以帮助你编写出更加高效、可维护的Java代码。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RPA系列-uipath 学习笔记3

用uipath读取excel填写表单 所有素材都搬运自uipath academy 读取数据 现在手头上有这样一份数据 需要按行依次把数据填入到浏览器中的表单中,首先创建一个空的process 在activity中拉入excel process scope,同时在里面点击use_excel_file,选择你要使用的file,并…

强力巨彩租赁屏技术更新,适用多种户外应用场景

现代社会,户外广告和活动展示是商家吸引公众注意力的主要方式之一。在这场视觉盛宴的背后,一款高效、稳定且适应性强的LED显示屏在其中扮演着重要角色。强力巨彩幻云户外HY3.9 H单边斜角底壳租赁屏是一款专为户外创意应用场景量身打造的LED显示屏产品&am…

SpringCloud 系列教程:微服务的未来(二)Mybatis-Plus的条件构造器、自定义SQL、Service接口基本用法

本篇博客将深入探讨 MyBatis-Plus 的三个核心功能:条件构造器、自定义 SQL 和 Service 接口的基本用法。通过对这些功能的学习和掌握,开发者能够更加高效地使用 MyBatis-Plus 进行业务开发。 目录 前言 条件构造器 自定义SQL Service接口基本用法 总结…

vue中proxy代理配置(测试一)

接口地址:http://jsonplaceholder.typicode.com/posts 1、配置一(代理没起作用) (1)设置baseURL为http://jsonplaceholder.typicode.com (2)proxy为 ‘/api’:’ ’ (3&a…

Element-ui的使用教程 基于HBuilder X

文章目录 1.Element-ui简介2.使用HBuilderX 创建一个基于Vue3的项目 (由于是使用的基于Vue3的Element-ui)3.安装element-ui4.在项目里完全引用element-ui5.引用组件6.运行项目 1.Element-ui简介 Element,一套为开发者、设计师和产品经理准备…

C语言从入门到放弃教程

C语言从入门到放弃 1. 介绍1.1 特点1.2 历史与发展1.3 应用领域 2. 安装2.1 编译器安装2.2 编辑器安装 3. 第一个程序1. 包含头文件2. 主函数定义3. 打印语句4. 返回值 4. 基础语法4.1 注释4.1.1 单行注释4.1.2 多行注释 4.2 关键字4.2.1 C语言标准4.2.2 C89/C90关键字&#xf…

Python OCR 文字识别

一.引言 文字识别,也称为光学字符识别(Optical Character Recognition, OCR),是一种将不同形式的文档(如扫描的纸质文档、PDF文件或数字相机拍摄的图片)中的文字转换成可编辑和可搜索的数据的技术。随着技…

LeetCode:257. 二叉树的所有路径

跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:257. 二叉树的所有路径 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根…

C++----------类的设计

二维点的表示(类设计) 知识点讲解: 封装:将数据成员(x和y坐标)设为private,这遵循了面向对象编程中的封装原则,防止外部代码随意修改类内部的数据,保证数据的安全性和完整…

教育行业 UI 设计基础篇:简洁直观的风格打造

在当今数字化时代,教育行业的线上平台如雨后春笋般涌现,而 UI 设计作为用户与教育产品交互的重要桥梁,其重要性不言而喻。对于教育行业而言,简洁直观的 UI 风格能够极大地提升用户体验,帮助学习者更高效地获取知识。 …

分布式协同 - 分布式事务_2PC 3PC解决方案

文章目录 导图Pre2PC(Two-Phase Commit)协议准备阶段提交阶段情况 1:只要有一个事务参与者反馈未就绪(no ready),事务协调者就会回滚事务情况 2:当所有事务参与者均反馈就绪(ready&a…

GFPS扩展技术原理(七)-音频切换消息流

音频切换消息流 Seeker和Provider通过消息流来同步音频切换能力,触发连接做切换,获取或设置音频切换偏好,通知连接状态等等。为此专门定义了音频切换消息流Message Group 为0x07,Message codes如下: MAC of Audio s…

实现 QTreeWidget 中子节点勾选状态的递归更新功能只影响跟节点的状态父节点状态不受影响

在 Qt 开发中,QTreeWidget 提供了树形结构的显示和交互功能。为了实现某个子节点勾选或取消勾选时,只影响当前节点及其子节点的状态,同时递归更新父节点的状态以正确显示 Qt::PartiallyChecked 或 Qt::Checked,我们可以借助 Qt 的…

计算机图形学知识点汇总

一、计算机图形学定义与内容 1.图形 图形分为“图”和“形”两部分。 其中,“形”指形体或形状,存在于客观世界和虚拟世界,它的本质是“表示”;而图则是包含几何信息与属性信息的点、线等基本图元构成的画面,用于表达…

Yolo11改策略:卷积改进|SAC,提升模型对小目标和遮挡目标的检测性能|即插即用

摘要 一、论文介绍 本文参考的论文主要介绍了DetectoRS模型,一个高性能的目标检测模型。DetectoRS通过引入递归特征金字塔(RFP)和可切换空洞卷积(SAC)两大创新点,显著提升了目标检测的精度。尽管原文并未…

Y3编辑器教程8:资源管理器与存档、防作弊设置

文章目录 一、资源管理器简介1.1 界面介绍1.2 资源商店1.3 AI专区1.3.1 AI文生图1.3.2 AI图生图1.3.3 立绘头像 二、导入导出2.1 文件格式2.2 模型导入2.2.1 模型制作后导出2.2.2 模型文件导入Y3编辑器2.2.3 Y3编辑器角色、装饰物模型要求 2.3 纹理导入2.4 材质贴图2.4.1 材质支…

【联动】【MSS】【AF】

【联动】【MSS】【AF】 一、版本要求 AF:不低于8.0.7;AF8.0.7R2不支持接入 二、接入配置 2.1、AF配置 对于AF8.0.13版本及以上,登录WEB控制台,点击[下一代安全防护体系] -> [云网联动] -> [云网接入设置],然…

攻防世界 cookie

开启场景 Cookie(HTTP cookie)是一种存储在用户计算机上的小型文本文件。它由网站通过用户的浏览器在用户访问网站时创建,并存储一些用于跟踪和识别用户的信息。Cookie 主要用于在网站和浏览器之间传递数据,以便网站可以根据用户的…

STM32-笔记11-手写带操作系统的延时函数

1、为什么带操作系统的延时函数,和笔记10上的延时函数不能使用同一种? 因为笔记10的延时函数在每次调用的时候,会一直开关定时器,而在FreeRTOS操作系统中,SysTick定时器当作时基使用。 时基是一个时间显示的基本单位。…

JWT令牌与微服务

1. 什么是JWT JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于作为JSON对象在各方之间安全地传输信息。JWT通常用于身份验证和信息交换。 以下是JWT的一些关键特性: 紧凑&#xff…