重载和重写有什么区别?

在Java编程中,理解重载(Overloading)和重写(Overriding)是非常重要的,它们分别在编译期和运行期提供了不同的多态性。以下我们详细剖析这两个概念,并通过实例代码和实际应用场景来帮助理解。

重载(Overloading)

重载发生在同一个类中,允许同一个方法名有不同的参数列表。重载的目的是提高方法的可读性和通用性。重载的实际应用可以是构造函数的重载、不同类型参数的处理等。

特点:

  1. 方法名相同
  2. 参数列表不同(参数类型、参数个数、参数顺序至少有一个不同)。
  3. 返回类型和访问修饰符可以不同

示例代码:

java

public class OverloadExample {
    // 重载方法:无参数
    public void display() {
        System.out.println("无参数方法");
    }

    // 重载方法:一个整数参数
    public void display(int a) {
        System.out.println("一个整数参数: " + a);
    }

    // 重载方法:两个参数,类型不同
    public void display(int a, String b) {
        System.out.println("两个参数: " + a + ", " + b);
    }

    // 重载方法:两个参数,顺序不同
    public void display(String b, int a) {
        System.out.println("两个参数,顺序不同: " + b + ", " + a);
    }
}

实际应用场景:
构造函数重载是非常常见的例子。当我们需要为类提供多个初始化方式时,使用构造函数重载可以简化代码并提高灵活性。

java

public class Employee {
    private String name;
    private int age;

    // 无参数构造函数
    public Employee() {
        this.name = "Unknown";
        this.age = 0;
    }

    // 一个参数构造函数
    public Employee(String name) {
        this.name = name;
        this.age = 0;
    }

    // 两个参数构造函数
    public Employee(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
重写(Overriding)

重写发生在子类与父类之间,是子类对父类方法的重新实现。重写的目的是实现动态多态性,使得子类可以根据自己的需要重新定义父类的方法。

特点:

  1. 方法名相同,参数列表相同
  2. 返回类型应相同或是父类返回类型的子类
  3. 访问修饰符应大于或等于父类方法
  4. 抛出的异常应小于或等于父类方法
  5. 父类方法不能是privatefinalstatic

示例代码:

java

class Animal {
    public void sound() {
        System.out.println("动物发出声音");
    }
}

class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("狗叫: 汪汪");
    }
}

实际应用场景:
在实际开发中,重写经常用于实现不同的行为。例如,图形库中的draw()方法可以被不同的图形类(如CircleRectangle)重写,以实现各自的绘制逻辑。

java

abstract class Shape {
    abstract void draw();
}

class Circle extends Shape {
    @Override
    void draw() {
        System.out.println("绘制圆形");
    }
}

class Rectangle extends Shape {
    @Override
    void draw() {
        System.out.println("绘制矩形");
    }
}
总结
区别点重载方法重写方法
发生范围同一个类子类与父类
参数列表必须不同必须相同
返回类型可以不同应相同或是父类返回类型的子类
抛出异常可以不同应小于或等于父类方法
访问修饰符可以不同应大于或等于父类方法
发生阶段编译期运行期

方法的重写要遵循“两同两小一大”:

  • “两同”:方法名相同、形参列表相同;
  • “两小”:子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;
  • “一大”:子类方法的访问权限应比父类方法的访问权限更大或相等。

特别说明重写的返回值类型:
如果方法的返回类型是引用类型,重写时可以返回该引用类型的子类。

java

class Hero {
    public String name() {
        return "超级英雄";
    }
    
    public Hero getHero() {
        return new Hero();
    }
}

class SuperMan extends Hero {
    @Override
    public String name() {
        return "超人";
    }

    @Override
    public SuperMan getHero() {
        return new SuperMan();
    }
}

通过上述例子和解释,我们可以更清楚地理解重载和重写的区别和应用场景,在实际开发中合理使用这两种技术可以大大提高代码的可读性和可维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【从零开始学架构 架构基础】二 架构设计的复杂度来源:高性能复杂度来源

架构设计的复杂度来源其实就是架构设计要解决的问题,主要有如下几个:高性能、高可用、可扩展、低成本、安全、规模。复杂度的关键,就是新旧技术之间不是完全的替代关系,有交叉,有各自的特点,所以才需要具体…

FestDfs快速安装和数据迁移同步。Ubuntu环境

一:防火墙 ufw status 二:下载 分别是(环境依赖,网络模块依赖,安装包) git clone https://github.com/happyfish100/libfastcommon.git git clone https://github.com/happyfish100/libserverframe.git …

package-lock.json导致npm install安装nyc出现超时错误

一、背景 前端项目在npm install安装依赖,无法下载组件nyc,详细报错信息: npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/nyc/download/nyc-13.3.0.tgz?cache0&a…

析构函数详解

目录 析构函数概念特性对象的销毁顺序 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒 个人主页 🥸🥸🥸 C语言 🐿️🐿️🐿️ C语言例题 &…

开源标注工具LabelMe的使用

开源标注工具LabelMe使用Python实现,并使用Qt作为其图形界面,进行图像多边形标注。源码地址:https://github.com/labelmeai/labelme ,最新发布版本为v5.4.1,它遵循GNU通用公共许可证的条款。 1.Features (1).多边形、矩形、圆形、…

Linux下mysql备份

参考文章: Linux实现MySQL数据库数据自动备份,并定期删除以前备份文件-CSDN博客文章浏览阅读7.2k次,点赞7次,收藏29次。引言在学习过程中遇到了一个问题,见图:当我进入服务器的数据库时,原来的…

羊大师:羊奶健康的成长伴侣

羊大师:羊奶健康的成长伴侣 在追求健康生活的当下,越来越多的人开始关注饮食的营养与健康。羊大师发现在众多天然食品中,羊奶以其独特的营养价值和健康益处,逐渐成为了人们的新宠。特别是对于正在成长发育的孩子们来说&#xff0…

客户端Web资源缓存

为了提高Web服务器的性能,其中的一种可以提高Web服务器性能的方法就是采用缓存技术。 1.缓存 1.1.什么是缓存? 如果某个资源的计算耗时或耗资源,则执行一次并存储结果。当有人随后请求该资源时,返回存储的结果,而不是再次计算。…

免费视频格式在线转换网站,推荐这5款!

在数字化时代,视频已成为我们日常生活和工作中不可或缺的一部分。然而,随着各种设备和平台的不断涌现,视频格式繁多,常常会出现不兼容的情况。为了解决这一问题,视频格式在线转换网站应运而生,成为了我们应…

【数据结构】排序(归并排序,计数排序)

一、归并排序 基本思想: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列&#xf…

百度百舸 AIAK-LLM 的大模型训练和推理加速实践

本文整理自 4 月 16 日的 2024 百度 Create 大会的公开课分享《百舸 AIAK-LLM:大模型训练和推理加速实践》。 今天要分享的主题是 AI Infra 相关的内容,主要内容分为四部分。 首先和大家一起讨论大模型给基础设施带来的挑战。第二部分则是向大家介绍一个…

力扣HOT100 - 32. 最长有效括号

解题思路&#xff1a; 栈 class Solution {public int longestValidParentheses(String s) {int max 0;// 也可以使用 Stack<Integer> stacknew Stack<>();但Stack是遗留类&#xff0c;不推荐Deque<Integer> stack new LinkedList<>();stack.push(…

犀牛Rhinoceros 8创建、编辑、分析、记录、渲染、制作动画和转换

Rhino - 多功能 3D 建模器。 Rhinoceros 可以创建、编辑、分析、记录、渲染、制作动画和转换 NURBS* 曲线、曲面、实体、点云和多边形网格。除了硬件之外&#xff0c;复杂性、程度或大小没有任何限制。 特殊功能包括&#xff1a; -不受约束的自由形式 3D 建模工具&#xff0c;…

【汇编】算术指令

一、加法指令 &#xff08;一&#xff09;各加法指令的格式及操作 加法指令可做字或字节运算 &#xff08;1&#xff09;加法指令 ADD 格式&#xff1a;ADD DST,SRC执行的操作&#xff1a;(DST) ← (SRC)(DST) &#xff08;2&#xff09;带进位加法指令 ADC 格式&#xf…

ENZO--Leptin (human) ELISA kit

瘦素(Leptin)是由ob基因编码、在脂肪组织中生成的一种脂肪代谢调控产物&#xff0c;在代谢和调控体重等方面发挥重要作用。它通过下丘脑中的瘦素受体发出信号&#xff0c;降低食欲&#xff0c;增加能量消耗。在外周组织中&#xff0c;瘦素能拮抗胰岛素信号传导&#xff0c;增加…

目标检测标注工具Labelimg安装与使用

目录 一、安装Labelimg与打开 二、使用 1、基本功能介绍 2、快捷键 3、状态栏的工具 4、数据准备 5、标注 三、附录 1、YOLO模式创建标签的样式 2、create ML模式创建标签的样式 3、PascalVOC模式创建标签的样式 一、安装Labelimg与打开 源码网址&#xff1a;Label…

前端通知组件封装

背景 实现如上图效果&#xff1a;点击小铃铛&#xff0c;从右侧展示通知&#xff0c;点击其中一条跳&#xff0c;转到一个新页面&#xff1b;小铃铛数目减少&#xff1b; 实现 index.vue <template><el-drawerv-if"visible":visible.sync"visible&…

C#知识|上位机子窗体嵌入主窗体方法(实例)

哈喽,你好啊,我是雷工! 上位机开发中,经常会需要将子窗体嵌入到主窗体, 本节练习C#中在主窗体的某个容器中打开子窗体的方法。 01 需求说明 本节练习将【账号管理】子窗体在主窗体的panelMain容器中打开。 账号管理子窗体如下: 主窗体的panelMain容器位置如图: 02 实现…

【找到所有数组中消失的数字】leetcode,python

很菜的写法&#xff1a; class Solution:def findDisappearedNumbers(self, nums: List[int]) -> List[int]:nlen(nums)#存1-Nnum_1[i for i in range(1,n1)]#预存数num_2[]nums.sort()for i in nums:num_1[i-1]0for i in num_1:if i!0:num_2.append(i)return num_2能过但是…

计算机毕业设计hadoop+hive+hbase学情分析 在线教育大数据 课程推荐系统 机器学习 深度学习 人工智能 大数据毕业设计 知识图谱

毕 业 设 计&#xff08;论 文&#xff09;开 题 报 告 1&#xff0e;结合毕业设计&#xff08;论文&#xff09;课题情况&#xff0c;根据所查阅的文献资料&#xff0c;每人撰写不少于1000字的文献综述&#xff1a; 一、研究背景和意义 “互联网”和大数据带来了网络教育的蓬…