【Java基础】21.重写(Override)与重载(Overload)

文章目录

  • 一、重写(Override)
    • 1.方法重写
    • 2.方法的重写规则
    • 3.Super 关键字的使用
  • 二、重载(Overload)
    • 1.方法重载
    • 2.重载规则
    • 3.实例
  • 三、重写与重载之间的区别


一、重写(Override)

1.方法重写

重写(Override)是指子类定义了一个与其父类中具有相同名称、参数列表和返回类型的方法,并且子类方法的实现覆盖了父类方法的实现。 即外壳不变,核心重写!

重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。这样,在使用子类对象调用该方法时,将执行子类中的方法而不是父类中的方法。

重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,抛出 IOException 异常或者 IOException 的子类异常。

在面向对象原则里,重写意味着可以重写任何现有方法。

实例:
父类 Phone:

public class Phone {
    public void call() {
        System.out.println("开始打电话~~~~");
    }

    public void sendMessage() {
        System.out.println("开始发送短信~~~~");
    }
}

子类 NewPhone 继承父类 Phone:

public class NewPhone extends Phone {
    /**
     * call方法重写
     */
    @Override
    public void call() {
        super.call(); // super 调用父类方法
        System.out.println("支持语音通话和视频通话~~~~");
    }

    /**
     * sendMessage方法重写
     */
    @Override
    public void sendMessage() {
        // super.sendMessage(); // 不用 super 调用父类方法
        System.out.println("支持发送图片和视频~~~~");
    }
}

测试类:

/**
 * @ClassName: Test
 * @Description: 重写(Override)
 * 子类继承父类,子类定义了一个与其父类中具有相同名称、参数列表和返回类型的方法,
 * 并且子类方法的实现覆盖了父类方法的实现。即外壳不变,核心重写!
 * @author: Zh
 * @date: 2024/4/20 15:06
 */
public class Test {
    public static void main(String[] args) {
        Phone p = new Phone(); // Phone 对象
        Phone huawei = new NewPhone(); // NewPhone 对象
        System.out.println("----父类Phone----");
        p.call();
        p.sendMessage();
        System.out.println("----子类NewPhone重写方法----");
        huawei.call();
        huawei.sendMessage();
    }
}

编译运行结果如下:

----父类Phone----
开始打电话~~~~
开始发送短信~~~~
----子类NewPhone重写方法----
开始打电话~~~~
支持语音通话和视频通话~~~~
支持发送图片和视频~~~~

在上面的例子中可以看到,尽管 huawei 属于 Phone类型,但是它运行的是 NewPhone 类的方法。这是由于在编译阶段,只是检查参数的引用类型。

然而在运行时,Java 虚拟机(JVM)指定对象的类型并且运行该对象的方法。因此在上面的例子中,之所以能编译成功,是因为 Phone 类中存在 call 方法和 sendMessage 方法,然而运行时,运行的是特定对象的方法。

2.方法的重写规则

  • 参数列表与被重写方法的参数列表必须完全相同。
  • 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。
  • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
  • 父类的成员方法只能被它的子类重写。
  • 声明为 final 的方法不能被重写。
  • 声明为 static 的方法不能被重写,但是能够被再次声明。
  • 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。
  • 子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
  • 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
  • 构造方法不能被重写。
  • 如果不能继承一个类,则不能重写该类的方法。

3.Super 关键字的使用

当需要在子类中调用父类的被重写方法时,要使用 super 关键字。
实例:

public class NewPhone extends Phone {
    /**
     * call方法重写
     */
    @Override
    public void call() {
        super.call(); // super 调用父类方法
        System.out.println("支持语音通话和视频通话~~~~");
    }

    /**
     * sendMessage方法重写
     */
    @Override
    public void sendMessage() {
        // super.sendMessage(); // 不用 super 调用父类方法
        System.out.println("支持发送图片和视频~~~~");
    }
}

二、重载(Overload)

1.方法重载

重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。

2.重载规则

  • 被重载的方法必须改变参数列表(参数个数或类型不一样);
  • 被重载的方法可以改变返回类型;
  • 被重载的方法可以改变访问修饰符;
  • 被重载的方法可以声明新的或更广的检查异常;
  • 方法能够在同一个类中或者在一个子类中被重载。
  • 无法以返回值类型作为重载函数的区分标准。

3.实例

/**
 * @ClassName: MethodDemo2
 * @Description: 重载(Overload)
 * 方法重载:同一个类中,多个方法名称相同,形参列表不同
 * @author: Zh
 * @date: 2024/4/14 21:59
 */
public class MethodDemo2 {
    public static void main(String[] args) {
        open();
        open(11);
        open(34, 56);
        open(66.6, 8);
        OPEN();
    }

    /**
     * 新方法open
     */
    public static void open() {
        System.out.println("open方法(无参数)。");
    }

    /**
     * 重载方法open
     *
     * @param a
     */
    public static void open(int a) {
        System.out.println("open方法,参数为int " + a);
    }

    /**
     * 重载方法open
     *
     * @param a
     * @param b
     */
    static void open(int a, int b) {
        System.out.println("open方法,参数为int " + a + ",int " + b);
    }

    /**
     * 重载方法open
     *
     * @param a
     * @param b
     */
    public static void open(double a, int b) {
        System.out.println("open方法,参数为double " + a + ",int " + b);
    }

    /**
     * 重载方法open
     *
     * @param a
     * @param b
     */
    public static void open(int a, double b) {
        System.out.println("open方法,参数为int " + a + ",double " + b);
    }

    /**
     * 新方法OPEN
     */
    public static void OPEN() {
        System.out.println("OPEN方法(无参数)。");
    }

}

编译运行结果如下:

open方法(无参数)open方法,参数为int 11
open方法,参数为int 34,int 56
open方法,参数为double 66.6,int 8
OPEN方法(无参数)

三、重写与重载之间的区别

重写和重载的区别
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。

  1. 方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
  2. 方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
  3. 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

重写与重载

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

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

相关文章

LeetCode - 150. 逆波兰表达式求值

LeetCode - 150. 逆波兰表达式求值 解题思路: 想要解决该题目,我们首先需要知道什么是逆波兰表达式,逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。 我们平常使用的算式则是一种中缀表达式,如( 1 2 …

Spring基础 SpringAOP

前言 我们都知道Spring中最经典的两个功能就是IOC和AOP 我们之前也谈过SpringIOC的思想 容器编程思想了 今天我们来谈谈SpringAOP的思想 首先AOP被称之为面向切面编程 实际上面向切面编程是面向对象的编程的补充和完善 重点就是对某一类问题的集中处理 前面我们写的统一异常管理…

React Router 6 + Ant Design:构建基于角色的动态路由和菜单

要根据用户的角色生成不同的路由菜单并实现权限控制,你可以采取以下步骤: 定义路由配置 首先,你需要定义一个包含所有可能路由的配置文件,例如: const routes [{path: /dashboard,element: <DashboardPage />,roles: [admin, manager, user]},{path: /users,element:…

设计模式——模板方法

1)模板方法模式(Template Method Pattem)&#xff0c;又叫模板模式(Template Patern)&#xff0c;在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行。 2)简单说&#xff0c;模板方法模式 定义一个操作中…

Splashtop Cloud RADIUS 解决方案入围教育技术奖

2024年4月17日 加利福尼亚州库比蒂诺 Splashtop 在简化随处办公的远程解决方案领域处于领先地位&#xff0c;该公司自豪地宣布最近入围了《教育技术文摘》&#xff08;EdTech Digest&#xff09;的“2024年教育技术奖”的“炫酷工具”决赛。教育科技奖成立于2010年&#xff0c…

都2024 年了,可以卸载的VS Code 插件

在 VS Code 中&#xff0c;庞大的插件市场提供了丰富多样的扩展功能&#xff0c;以增强编码体验和效率。然而&#xff0c;如果你安装了很多插件&#xff0c;就可能会导致&#xff1a; 性能下降&#xff1a;过多的插件可能导致 VS Code 的启动速度变慢&#xff0c;特别是在启动或…

【自动驾驶车辆-运动控制】运动学模型(Kinematic Model) | 手写数学推导公式 by.Akaxi

【前言】 在设计自动驾驶规控算法时&#xff0c;常常需要获取车辆的各种位姿、角度等信息&#xff0c;要控制车辆的运动&#xff0c;首先要对车辆的运动建立数字化模型&#xff0c;模型建立的越准确&#xff0c;对车辆运动的描述越准确&#xff0c;对车辆的跟踪控制的效果就越…

【Leetcode笔记】236.二叉树的最近公共祖先

文章目录 题目要求ACM运行结果 题目要求 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能…

过滤器Filter和拦截器Interceptor心得

上一篇文章讲了监听器Listener&#xff0c;下面我们来讲一下过滤器和拦截器。 一、过滤器Filter。 首先&#xff0c;servlet容器&#xff08;比如tomcat&#xff09;肯定的要有servlet才能发挥它的光彩。在上古jsp时代&#xff0c;我们会写各种servlet通过不同的请求来实现我…

浅说深度优先搜索(中)——回溯

写在最前 相信在你们不懈的努力之下&#xff0c;基本的递归一定可以写出来了&#xff0c;那么我们现在就来看看递归的升级版——回溯怎么写吧&#xff01; 简说回溯 递归是一种特别重要的解题策略。大部分题目需要找到最优解&#xff0c;而这个求解过程可能存在一定的规律性…

排序算法之基数排序

目录 一、简介二、代码实现三、应用场景 一、简介 算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度排序方式稳定性基数排序O(n*k)O(n*k)O(n*k)O(nk)Out-place稳定 稳定&#xff1a;如果A原本在B前面&#xff0c;而AB&#xff0c;排序之后A仍然在B的前面&#xff1b…

03-为啥大模型LLM还没能完全替代你?

1 不具备记忆能力的 它是零状态的&#xff0c;我们平常在使用一些大模型产品&#xff0c;尤其在使用他们的API的时候&#xff0c;我们会发现那你和它对话&#xff0c;尤其是多轮对话的时候&#xff0c;经过一些轮次后&#xff0c;这些记忆就消失了&#xff0c;因为它也记不住那…

笔记本电脑坏了硬盘数据会丢失吗 笔记本电脑坏了如何取出硬盘的资料 数据恢复软件

笔记本电脑对我们真的非常重要了&#xff0c;是实现无纸化办公和学习的重要工具&#xff0c;但是如果笔记本电脑坏了我们存储在电脑里的资料该怎么办&#xff1f;笔记本电脑坏了硬盘数据会丢失吗&#xff1f;相信有许多朋友都会有这样的担忧。本文今天就为大家解决笔记本电脑坏…

Docker 的基本管理

一. 云的相关知识 1. 关于云 云端服务器都有哪些提供商&#xff1a; 国内&#xff1a; 阿里云&#xff08;Alibaba Cloud&#xff09;&#xff1a; 提供ECS&#xff08;Elastic Compute Service&#xff09;弹性计算服务&#xff0c;包括通用型、计算型、内存型等多种实例…

CodeGemma初探

什么是 CodeGemma CodeGemma是一系列强大而轻量级的模型的集合&#xff0c;可以执行各种编码任务&#xff0c;包括填充中间代码补全、代码生成、自然语言理解、数学推理和指令跟随。 版本&#xff1a; instruct&#xff1a;7B, 这个版本专门针对自然语言到代码聊天和指令跟随…

【Linux高性能服务器编程】——高性能服务器框架

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之高性能服务器框架介绍&#xff0c;在这篇文章中&#xff0c;你将会学习到高效的创建自己的高性能服务器&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘UML图来帮助大家来理解&…

解锁EDM设计秘籍:关键要素一览,邮件如何设计?

一个成功的EDM邮件需要包含多个关键元素&#xff0c;从内容、设计到呼唤行动&#xff0c;每个环节都至关重要。今天&#xff0c;我们就来探讨EDM邮件中应包含的关键元素&#xff1f;以及如何设计邮件&#xff1f; 一、EDM必备关键要素 1、吸引眼球的主题行 主题行应该简短明了…

NC398 腐烂的苹果

腐烂的苹果 一个腐烂的苹果每分钟可以向上下左右四个方向扩展&#xff0c;扩展之后&#xff0c;又会有新的腐烂的苹果&#xff0c;一直去腐蚀好的苹果&#xff0c;求多少分钟后&#xff0c;网格中全是烂苹果。 第一次做这道题的时候&#xff0c;想到这道题考察的其实是多源BFS…

C#版Facefusion:让你的脸与世界融为一体!-04 人脸替换

C#版Facefusion&#xff1a;让你的脸与世界融为一体&#xff01;-04 人脸替换 目录 说明 效果 模型信息 项目 代码 下载 说明 C#版Facefusion一共有如下5个步骤&#xff1a; 1、使用yoloface_8n.onnx进行人脸检测 2、使用2dfan4.onnx获取人脸关键点 3、使用arcface_w60…

网络基础之-IP地址

文章目录 1. IP地址&#xff1a;网络和主机1.1 A类IP地址1.2 B类IP地址1.3 C类IP地址1.4 D类和E类IP地址 2.几个特殊的IP地址2.1 私有地址2.2网关 1. IP地址&#xff1a;网络和主机 IP地址是用于在计算机网络中唯一标识设备的一组数字。它由32位&#xff08;IPv4&#xff09;或…