目录

1. 方法重载 (Overload)

什么是方法重载?

重载的特点:

重载的示例:

重载的调用:

2. 方法重写 (Override)

什么是方法重写?

重写的特点:

重写的示例:

重写的调用:

3. 重写 vs 重载 对比表

4. 特殊情况和注意事项

静态方法

私有方法

final 方法

构造方法

5. 实际应用建议

总结


在 Java 面向对象编程中,方法重写和方法重载是两个重要但容易混淆的概念。它们都涉及到方法的定义,但有着本质的区别。

1. 方法重载 (Overload)

什么是方法重载?

方法重载是指在同一个类中,允许存在多个同名方法,但这些方法的参数列表必须不同(参数类型、参数个数或参数顺序不同)。

重载的特点:

  • 发生在同一个类中
  • 方法名必须相同
  • 参数列表必须不同(类型、个数、顺序)
  • 返回类型可以相同也可以不同
  • 访问修饰符可以不同
  • 可以抛出不同的异常

重载的示例:

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;}// 方法4:整数和浮点数相加 - 参数顺序不同(虽然这里效果类似)public double add(int a, double b) {return a + b;}// 方法5:浮点数和整数相加 - 参数顺序不同public double add(double a, int b) {return a + b;}
}

重载的调用:

编译器根据方法签名(方法名 + 参数列表)来决定调用哪个重载方法。

Calculator calc = new Calculator();
calc.add(1, 2);        // 调用 add(int, int)
calc.add(1, 2, 3);     // 调用 add(int, int, int)
calc.add(1.5, 2.5);    // 调用 add(double, double)

2. 方法重写 (Override)

什么是方法重写?

方法重写是指子类重新定义父类中已有的方法,提供特定的实现。重写的方法必须与父类方法有相同的方法签名返回类型(或是其子类)。

重写的特点:

  • 发生在继承关系的父子类之间
  • 方法名必须相同
  • 参数列表必须完全相同
  • 返回类型必须相同或是其子类(协变返回类型)
  • 访问修饰符不能比父类更严格
  • 不能抛出比父类方法更宽泛的检查异常

重写的示例:

// 父类
class Animal {public void makeSound() {System.out.println("动物发出声音");}public Animal getAnimal() {return new Animal();}
}// 子类
class Dog extends Animal {// 重写 makeSound 方法@Overridepublic void makeSound() {System.out.println("汪汪汪");}// 协变返回类型 - 返回 Dog 类型(Animal 的子类)@Overridepublic Dog getAnimal() {return new Dog();}
}// 另一个子类
class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("喵喵喵");}
}

重写的调用:

运行时根据对象的实际类型来决定调用哪个方法(多态的体现)。

Animal myAnimal = new Animal();
Animal myDog = new Dog();
Animal myCat = new Cat();myAnimal.makeSound(); // 输出: 动物发出声音
myDog.makeSound();    // 输出: 汪汪汪 (多态)
myCat.makeSound();    // 输出: 喵喵喵 (多态)

3. 重写 vs 重载 对比表

特性

方法重载 (Overload)

方法重写 (Override)

发生位置

同一个类中

继承关系的父子类之间

方法名

必须相同

必须相同

参数列表

必须不同

必须完全相同

返回类型

可以不同

必须相同或是其子类

访问修饰符

可以不同

不能比父类更严格

异常抛出

可以不同

不能抛出更宽泛的检查异常

调用时机

编译时决定

运行时决定(多态)

目的

提高方法灵活性

实现多态,定制子类行为

注解

可选使用 @Overload

建议使用 @Override

4. 特殊情况和注意事项

静态方法

静态方法可以被"重载",但不能被"重写"。如果子类定义了与父类相同的静态方法,这称为方法隐藏(Method Hiding),不是重写。

class Parent {static void staticMethod() {System.out.println("Parent static method");}
}class Child extends Parent {static void staticMethod() {  // 这是隐藏,不是重写System.out.println("Child static method");}
}

私有方法

私有方法不能被重写,因为它们在子类中不可见。私有方法可以被重载。

final 方法

final 方法不能被重写,但可以被重载。

构造方法

构造方法可以被重载(在同一个类中),但不能被重写(因为构造方法不能继承)。

5. 实际应用建议

  1. 使用 @Override 注解:在重写方法时加上 @Override 注解,让编译器帮助检查是否正确重写
  2. 遵守里氏替换原则:子类重写的方法不应该改变父类方法的预期行为
  3. 谨慎重写:不要随意重写核心方法,特别是 equals(), hashCode(), toString() 等方法
  4. 文档注释:为重写方法添加适当的文档注释,说明与父类方法的区别

总结

方法重载和重写是 Java 多态性的两种不同表现形式:

  • 重载是编译时多态,通过不同的参数列表提供方法的不同版本
  • 重写是运行时多态,通过子类定制父类行为来实现真正的多态

理解它们的区别对于编写良好的面向对象代码至关重要。记住这个简单的口诀:重载同类不同参,重写异类同参不同实现

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

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

相关文章

微信小程序发送订阅消息-一次订阅,一直发送消息。

实现思路长期订阅要求太高,需要政府、公共交通等单位才有资格,所以只能使用一次性订阅。 就像是买奶茶,下单以后,会弹出让用户订阅消息那种。以买奶茶为例:用户第一次下单成功,点击了订阅消息。(一般都有三…

408 Request Timeout:请求超时,服务器等待客户端发送请求的时间过长。

408 Request Timeout 是 HTTP 状态码之一,表示客户端在发送请求时,服务器等待的时间过长,最终放弃了处理该请求。此问题通常与网络延迟、客户端配置、服务器设置或者应用程序的性能有关。1. 常见原因1.1 客户端问题网络连接延迟或不稳定&…

MongoDB面试集锦

该书的使用的MongoDB版本是 4.2.01、什么是NoSQL数据库?NoSQL和RDBMS有什么区别?在那些情况下使用和不使用NoSQL数据库?NoSQL是非关系型数据库,NoSQLNot Only SQL 。关系型数据库采用的是结构化的数据,NoSQL采用的是键…

直击JVM面试题

JVM组成 JVM JVM 就是 Java 程序的运行环境,它通过 类加载、字节码执行、内存管理、GC、线程调度 等机制,让 Java 实现了 跨平台、自动内存管理和高效执行。 它是一个抽象的计算机,能执行以 字节码(.class 文件) 为单…

地球系统模式(CESM)实践技术应用及进阶

目前通用地球系统模式(Community Earth System Model,CESM)在研究地球的过去、现在和未来的气候状况中具有越来越普遍的应用。CESM由美国NCAR于2010年07月推出以来,一直受到气候学界的密切关注。近年升级的CESM2.0在大气、陆地、海…

StarRocks导入数据-使用 Broker Load 进行异步导入

目录 一、背景 二、实操 三、查看导入进度 一、背景 将hive库数据表导入starrocks. 二、实操 LOAD LABEL user_behavior (DATA INFILE("hdfs://<hdfs_ip>:<hdfs_port>/user/amber/user_behavior_ten_million_rows.parquet")INTO TABLE user_behavior…

c语言,识别到黑色就自动开枪,4399单击游戏狙击战场,源码分享,豆包ai出品

不好用&#xff0c;识别速度慢&#xff0c;有时候识别不准确#include <windows.h> #include <stdio.h> #include <math.h> HDC hdcScreen; void leftClick(); void RGBtoHSV(int r, int g, int b, int* h, int* s, int* v); int fuzzyFindColor(int x1, int…

电动汽车充电标准之 — SAE J1772“电动汽车传导充电连接器”简介

SAE J1772&#xff08;通常读作 "J seventeen seventy-two"&#xff09;是由美国汽车工程师学会&#xff08;SAE&#xff09;制定的&#xff0c;针对电动汽车传导充电连接器的北美标准。它规范了电动汽车&#xff08;EV&#xff09;与充电设备&#xff08;EVSE&#…

ZooKeeper Multi-op+乐观锁实战优化:提升分布式Worker节点状态一致性

系列文章目录 第一章 ZooKeeper入门概述:Znode,Watcher,ZAB . 第二章 技术解析&#xff1a;基于 ZooKeeper 实现高可用的主-从协调系统&#xff08;通过例子深入理解Zookeeper如何进行协调分布式系统&#xff09; 第三章 基于 ZooKeeper 的主从模式任务调度系统&#xff1a;设…

生产制造过程精益化

一、核心原则&#xff1a;以“消除浪费、创造价值”为核心精益化的本质是通过系统性优化流程&#xff0c;最大化客户价值&#xff0c;最小化资源浪费&#xff08;时间、成本、库存等&#xff09;&#xff0c;核心原则包括&#xff1a;1. 价值导向原则定义客户价值&#xff1a;从…

Ping命令为何选择ICMP而非TCP/UDP?

在网络诊断工具中&#xff0c;ping是最常用的命令之一&#xff0c;它用于测试主机之间的连通性。有趣的是&#xff0c;ping命令并不使用TCP或UDP这些传输层协议&#xff0c;而是基于网络层的ICMP协议。这背后的设计选择体现了计算机网络协议栈的分层智慧和特定用途的优化。ICMP…

VGGNet:为什么16层简单堆叠能成为CNN经典?

配套笔记&讲解视频,点击文末名片获取 研究背景和动机 在 VGG 出现之前,图像识别就像“盲人摸象”: 计算机看一张图,只能凭感觉抓几个零散的“特征点”, 结果忽好忽坏,时灵时不灵。 大家发现,如果把“看图的流程”做得更深、更系统,准确率就能蹭蹭往上涨。于是“深一…

springboot+vue医院诊疗管理系统(源码+文档+调试+基础修改+答疑)

目录 一、整体目录&#xff08;示范&#xff09;&#xff1a; 文档含项目技术介绍、E-R图、数据字典、项目功能介绍与截图等 二、运行截图 三、代码部分&#xff08;示范&#xff09;&#xff1a; 四、数据库表(示范)&#xff1a; 数据库表有注释&#xff0c;可以导出数据…

云蝠智能大模型呼叫新模型上线,拥抱AGI

在人工智能浪潮席卷全球的今天&#xff0c;AGI&#xff08;通用人工智能&#xff09;已不再遥不可及&#xff0c;而是正逐步成为驱动产业变革的核心力量。在这场技术革命中&#xff0c;云蝠智能以其前瞻性的战略布局和技术创新&#xff0c;再次引领行业风向——全新大模型呼叫模…

晨控CK-GW08S-PN与西门子PLC配置Profinet通讯连接操作手册

晨控CK-GW08S-PN与西门子PLC配置Profinet通讯连接操作手册晨控CK-GW08S系列作为晨控智能工业级别网关型RFID读写器,支持大部分工业协议如RS232、RS485、以太网。支持工业协议Modbus RTU、Modbus TCP、Profinet、EtherNet/lP、EtherCat以及自由协议TCP/IP等。本期主题&#xff1…

【Linux】Linux常用指令合集

本文是小编巩固自身而作&#xff0c;如有错误&#xff0c;欢迎指出&#xff01; 目录 一、文件与目录操作 (1) 查看目录&#xff0c;切换目录 pwd ls cd &#xff08;2&#xff09;创建、 删除 mkdir touch rmdir rm cp mv 二、文件的查看及更改 (1)查看和更改 …

MySQL 高级特性与性能优化:深入理解函数、视图、存储过程、触发器

大家好&#xff01;今天我们要深入探讨 MySQL 中一些非常重要的高级主题——内置函数、视图、存储过程、触发器、索引、事务和锁机制。无论你是刚开始学习数据库的新手&#xff0c;还是经验丰富的开发者&#xff0c;掌握这些知识点都将极大提升你的开发效率和数据管理能力。一.…

Linux学习:基于环形队列的生产者消费者模型

目录1. 环形队列的概念与实现方法1.1 环形队列的概念1.2 环形队列的一般实现方法2. 多线程相关的信号量概念与接口2.1 信号量类型2.2 信号量的初始化与销毁2.3 信号量的P申请、V释放操作3. 基于环形队列实现p、c模型的设计方案3.1 环形队列&#xff08;ringqueue&#xff09;作…

【左程云算法07】队列和栈-链表数组实现

目录 ​编辑1&#xff09;队列的介绍 核心操作 3&#xff09;队列的链表实现和数组实现 使用数组实现队列 2&#xff09;栈的介绍 核心操作 4&#xff09;栈的数组实现 使用语言内置的实现 使用数组手动实现栈 5&#xff09;环形队列的实现 leecode622 代码解析 视频…

Docker 清理完整指南:释放磁盘空间的最佳实践

前言 随着 Docker 使用时间的增长,系统中会积累大量的容器、镜像、数据卷和构建缓存,占用大量磁盘空间。本文将详细介绍如何有效清理 Docker 资源,释放磁盘空间,保持系统整洁。 Docker 资源类型 Docker 主要占用磁盘空间的资源包括: 容器 (Containers):运行中和已停止…