Java中的方法重写与重载

在Java编程语言中,方法重写(Override)和方法重载(Overload)是实现代码多态性的两种基本方式。它们允许程序员以多种方式使用相同的方法名,增加了程序的可读性和可重用性,但它们的应用场景和规则各不相同。

方法重写(Override)

方法重写是面向对象编程中的一个核心概念,它允许子类提供特定的实现细节,以替换从父类继承的方法。当子类需要修改继承自父类的行为方式时,就会用到方法重写。

例如,考虑以下简单的代码示例:

class Animal {
    public void move() {
        System.out.println("动物可以移动");
    }
}

class Dog extends Animal {
    @Override
    public void move() {
        System.out.println("狗可以跑和走");
    }
}

public class TestDog {
    public static void main(String args[]) {
        Animal a = new Animal();
        Animal b = new Dog();

        a.move();  // 输出: 动物可以移动
        b.move();  // 输出: 狗可以跑和走
    }
}

在这个例子中,Dog 类重写了 Animal 类的 move 方法。这表明尽管 b 的引用类型是 Animal,但它执行的是 Dog 类的 move 方法,这是多态性的一种体现。

重写的规则包括:

  • 参数列表必须完全与被重写方法相同。
  • 返回类型可以是被重写方法的返回类型的子类型(Java 5及以上版本)。
  • 访问权限不能比父类中被重写的方法更严格。
  • 不能重写被声明为 finalstatic 的方法。
  • 如果父类方法抛出异常,重写的方法只能抛出相同的异常或其子类型。
方法重载(Overload)

方法重载发生在同一个类中,当有多个同名方法但参数列表不同时,这允许方法执行不同的功能。

考虑以下例子:

public class Overloading {
    public int test() {
        System.out.println("test1");
        return 1;
    }

    public void test(int a) {
        System.out.println("test2");
    }

    public String test(int a, String s) {
        System.out.println("test3");
        return "returntest3";
    }

    public String test(String s, int a) {
        System.out.println("test4");
        return "returntest4";
    }
    
    public static void main(String[] args) {
        Overloading o = new Overloading();
        o.test();              // 输出 test1
        o.test(1);             // 输出 test2
        o.test(1, "test3");    // 输出 test3
        o.test("test4", 1);    // 输出 test4
    }
}

在这个示例中,Overloading 类通过改变参数列表重载了 test 方法。

重载的规则包括:

  • 参数列表必须不同(参数数量或类型不同)。
  • 返回类型可以相同或不同。
  • 访问权限和抛出的异常类型可以改变。
重写与重载的区别
  • 参数列表:重载要求参数列表必须不同;重写要求参数列表必须相同。
  • 返回类型:重载允许返回类型不同;重写在Java 7及以上版本中允许返回类型为派生类型。
  • 异常处理:重载可以声明新的或更广的检查异常;重写只能抛出与原方法相同的或更具体的异常。
  • 访问权限:重载中可以改变访问权限;重写中不能实行更严格的访问权限。

总结

方法重载和重写都是Java多态性的表现形式,它们使得Java程序更加灵活和具有可扩展性。通过重载,可以定义具有不同参数的同名方法;通过重写,子类能够提供某个已经在父类中定义过的方法的特定实现。理解这两者的区别和应用场景,对于编写高效、易维护的Java程序至关重要。

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

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

相关文章

Nginx+KeepAlived高可用负载均衡集群的部署

目录 一.KeepAlived补充知识 1.一个合格的群集应该具备的特点 2.健康检查(探针)常用的工作方式 3.相关面试问题 问题1 问题2 二.Keepealived脑裂现象 1.现象 2.原因 硬件原因 运用配置原因 3.解决 4.预防 方法1 方法2 方法3 方法4 三.…

【Spine学习04】之让角色动起来

1、切换左上角模式:设置改为动画 2、选择两个手臂的大臂节点 3、打开勾选自动关键帧按钮 4、开始K帧: Space空格可以快捷查看小黄人所有关键帧

英语翻译人工翻译优势

在全球化的时代,跨文化交流至关重要,而翻译则是连接不同语言和文化的重要桥梁。尽管近年来人工智能翻译取得了显著进展,但人工翻译的需求仍然无可替代,尤其是在专业和技术翻译领域。下面从专业角度阐述人工翻译相较于人工智能翻译…

python如何终止程序运行

方法1:采用sys.exit(0),正常终止程序,从图中可以看到,程序终止后shell运行不受影响。 方法2:采用os._exit(0)关闭整个shell,从图中看到,调用sys._exit(0)后整个shell都重启了(RESTAR…

[c++刷题]贪心算法.N01

题目如上: 首先通过经验分析,要用最少的减半次数,使得数组总和减少至一半以上,那么第一反应就是每次都挑数组中最大的数据去减半,这样可以是每次数组总和值减少程度最大化。 代码思路:利用大根堆去找数据中的最大值,…

VScode中连接并使用docker容器

前提条件: 1.在windows下安装Docker Desktop(方法可见下面的教程) Docker Desktop 安装使用教程-CSDN博客 2.在vscode安装3个必备的插件 3.先在ubuntu中把docker构建然后运行 4.打开vscode,按下图顺序操作 调试好之后上传到git上,然后后面…

李宏毅深度学习01——基本概念简介

视频链接 基本概念 Regression(回归): 类似于填空 Classification(分类): 类似于选择 Structure Learning(机器学习): ?? 机器学习找对应函数…

字符串排序-第13届蓝桥杯省赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第82讲。 字符串排序&#…

SSH协议

SSH协议简介 SSH(Secure Shell)是一种网络安全协议,用于在不安全的网络环境中提供加密的远程登录和其他网络服务。它通过加密和认证机制实现安全的访问和文件传输等业务,是Telnet、FTP等不安全远程shell协议的安全替代方案。 SSH协…

HSP_08章 断点调试

P100 断点调试 1. 基本介绍 一个实际场景 在开发中,新手程序员在查找错误时,这时有经验的程序员就会提示,可以用断点调试,一步一步的看源码执行的过程, 从而发现错误所在。 断点调试介绍 -基本介绍 2. 函数的调试

使用Ventoy制作U盘启动安装系统

简介 Ventoy是一个制作可启动U盘的开源工具。 无需反复地格式化U盘。你只要制作一次U盘启动盘,后面你只需要把 ISO/WIM/IMG/VHD(x)/EFI 等类型的系统镜像文件直接拷贝到U盘里面就可以启动了,无需其他操作。可以一次性拷贝很多个不同类型的镜像文件&…

文件监控工具——inotify-tools使用

在做灰盒测试和恶意程序分析的时候,经常需要寻找创建、删除、修改的文件,而在无法确定操作的文件或生成的文件路径时,就需要用到可以监控文件和目录的工具了。比如测试任意文件上传时,文件名被改为随机字符串且HTTP响应中不返回文…

光储充行业市场前景以及未来发展趋势

光储充行业作为新能源汽车产业链的重要环节,其市场前景广阔,未来发展趋势也呈现出积极向上的态势。随着新能源汽车市场的不断扩大,光储充设施的需求也日益增长,为行业的发展提供了强大的动力。 从未来发展趋势来看,光储…

每日一练:攻防世界:Misc文件类型

给了一个txt文本文件,因为题目是文件类型,我先开始一直在想关于文件头的知识。 这串数据看着像十六进制数据,我就直接把他转ASCII了 反转一下就是base64,因为base64没有_,所以去掉46ESAB_,base64解码Hex试…

Github2024-06-12 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4JavaScript项目2Lua项目1PHP项目1Blade项目1非开发语言项目1TypeScript项目1Shell项目1从零开始构建你喜爱的技术 创建周期:2156 天…

openlayers 绘图功能,编辑多边形,select,snap组件的使用(六)

本篇介绍一下vue3-openlayers的select,snap的使用 1 需求 点击开始绘制按钮开始绘制多边形,可以连续绘制多个多边形点击撤销上步按钮,撤销上一步绘制点绘制多个多边形(或编辑多边形时),鼠标靠近之前的已绘…

代码解读 | Hybrid Transformers for Music Source Separation[05]

一、背景 0、Hybrid Transformer 论文解读 1、代码复现|Demucs Music Source Separation_demucs架构原理-CSDN博客 2、Hybrid Transformer 各个模块对应的代码具体在工程的哪个地方 3、Hybrid Transformer 各个模块的底层到底是个啥(初步感受)&#xff1…

Tomcat部署以及虚拟主机

概论 Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,是 Apache 软件基金会的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。 Tomcat的组成 Tomcat 由一系列的组件构…

黑苹果睡眠总是自动唤醒(RTC)

黑苹果睡眠总是自动唤醒【RTC】 1. 问题2. 解决方案2.1. 查看重启日志2.2. 配置Disable RTC wake scheduling补丁 3. 后续4. 参考 1. 问题 黑苹果EFI 更换后,总是在手动 睡眠后,间歇性重启,然后再次睡眠,然后再重启。原因归结为&…

界面控件DevExpress WinForms垂直属性网格组件 - 拥有更灵活的UI选择(一)

DevExpress WinForms垂直&属性网格组件旨在提供UI灵活性,它允许用户显示数据集中的单个行或在其90度倒置网格容器中显示多行数据集。另外,用户可以把它用作一个属性网格,就像在Visual Studio IDE中那样。 P.S:DevExpress Win…