java-重载与重写

ops/2025/2/6 11:35:27/

介绍

在 Java 中,重载(Overloading) 和 重写(Overriding) 是两个重要的概念,它们都与方法有关,但它们的应用场景和行为完全不同。
通过理解重载和重写的区别,可以更好地设计类的继承和方法的多态性。

重载

重载是指在同一个类中,允许存在多个方法名相同但参数列表不同的方法。重载的目的是为了提供方法的多态性,使得同一个方法名可以根据不同的参数类型或数量执行不同的逻辑。

特点

  • 方法名相同:重载的方法必须具有相同的方法名。
  • 参数列表不同:参数的类型、数量或顺序必须不同。
  • 与返回值无关:重载与方法的返回值类型无关。
  • 与访问修饰符无关:重载方法可以有不同的访问修饰符(如 public、private 等)。
  • 发生在同一个类中:重载通常发生在同一个类中。

示例

java">class Calculator {// 重载方法:两个整数相加public int add(int a, int b) {return a + b;}// 重载方法:三个整数相加public int add(int a, int b, int c) {return a + b + c;}// 重载方法:两个浮点数相加public double add(double a, double b) {return a + b;}
}public class Main {public static void main(String[] args) {Calculator calc = new Calculator();System.out.println(calc.add(2, 3));           // 调用 add(int, int)System.out.println(calc.add(2, 3, 4));        // 调用 add(int, int, int)System.out.println(calc.add(2.5, 3.5));       // 调用 add(double, double)}
}

重写

重写是指子类重新定义父类中已有的方法。重写的目的是为了让子类可以根据自己的需求改变或扩展父类的行为。

特点

  • 方法名相同:重写的方法必须与父类方法具有相同的方法名。
  • 参数列表相同:重写的方法必须与父类方法具有相同的参数列表。
  • 返回值类型相同或兼容:重写方法的返回值类型必须与父类方法相同或是其子类(协变返回类型)。
  • 访问修饰符不能更严格:重写方法的访问修饰符不能比父类方法更严格(例如,父类方法是
    protected,子类方法可以是 public 或 protected,但不能是 private)。
  • 发生在父子类之间:重写发生在子类和父类之间。
  • 不能重写 final 方法:如果父类方法是 final,则不能重写。
  • 不能重写 static 方法:静态方法不能被重写,但可以隐藏(方法隐藏)。

示例

java">class Animal {public void makeSound() {System.out.println("Animal is making a sound");}
}class Dog extends Animal {@Override // 使用 @Override 注解表示重写public void makeSound() {System.out.println("Dog is barking");}
}public class Main {public static void main(String[] args) {Animal myDog = new Dog();myDog.makeSound(); // 输出: Dog is barking}
}

区别

在这里插入图片描述

注意事项

  • @Override 注解:

在重写方法时,建议使用 @Override 注解,这样编译器会检查方法是否正确地重写了父类方法。
如果没有正确重写(例如参数列表不同),编译器会报错。

  • 静态方法:
    静态方法不能被重写,但可以在子类中定义一个与父类静态方法签名相同的静态方法,这称为方法隐藏。

  • 构造方法:
    构造方法不能被重写,但可以被重载。

  • 协变返回类型:
    从 Java 5 开始,重写方法的返回值类型可以是父类方法返回值类型的子类。

示例对比

重载示例

java">class MathUtils {int add(int a, int b) {return a + b;}double add(double a, double b) {return a + b;}
}

重写示例

java">class Animal {void sound() {System.out.println("Animal sound");}
}class Dog extends Animal {@Overridevoid sound() {System.out.println("Dog bark");}
}

http://www.ppmy.cn/ops/156141.html

相关文章

Drools规则引擎初体验

前言 假设有这样一个场景,订单管理系统需要根据用户的消费情况,来为每个用户发放不同程度的优惠券,这个发放规则复杂且多变,我们该怎么办?在代码中写死显然是不可取的,规则一变就要修改代码,频…

Vue 图片引用方式详解:静态资源与动态路径访问

目录 前言1. 引用 public/ 目录2. assets/ 目录3. 远程服务器4. Vue Router 动态访问5. 总结6. 扩展(图片不显示) 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 在 Vue 开发中&#x…

后端【代码审查】C语言。

在后端开发中,你是如何进行代码审查的? 在后端开发中,进行代码审查是一项非常重要的质量保证活动。它不仅有助于发现潜在的问题和错误,还能促进团队成员之间的知识共享和技术水平提升。以下是我在进行代码审查时遵循的一些步骤和最…

4 前端前置技术(上):AJAX技术、Axios技术(前端发送请求)

文章目录 前言一、Ajax技术(从服务端获取数据,发送各种请求)0 接口文档管理:使用apipost等接口测试软件创建接口便于前端后端分离测试1 基本概念2 原生Ajax使用示例(几年前的早期用法) 二、 Axios技术(对原…

Matplotlib 高级图表绘制与交互式可视化(mpld3)

我们先重新回忆一下它的主要作用: 一、Matplotlib 简介 Matplotlib 是 Python 中一个非常强大的可视化库,广泛用于数据可视化、科学计算和工程领域。它提供了丰富的绘图功能,可以生成各种静态、动态和交互式的图表。以下是 Matplotlib 的主要功能及其详细讲解。 二、基本…

(十一)机器人系统的仿真——建造机器人模型

前言 对于ROS新手而言,可能会有疑问:学习机器人操作系统,实体机器人是必须的吗?答案是否定的,机器人一般价格不菲,为了降低机器人学习、调试成本,在ROS中提供了系统的机器人仿真实现,通过仿真&…

Leetcode::922. 按奇偶排序数组 II

给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数 。 对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。 你可以返回 任何满足上述条件的…

电商用户画像数据可视化分析

电商用户画像数据可视化分析 作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论&am…