【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方法重写*/@Overridepublic void call() {super.call(); // super 调用父类方法System.out.println("支持语音通话和视频通话~~~~");}/*** sendMessage方法重写*/@Overridepublic 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方法重写*/@Overridepublic void call() {super.call(); // super 调用父类方法System.out.println("支持语音通话和视频通话~~~~");}/*** sendMessage方法重写*/@Overridepublic 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. 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

重写与重载

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

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

相关文章

阿里云OSS 存储对象的注册与使用

目录 一、什么是阿里云OSS 二、 点击免费试用 2.1 选择第一个,点击免费试用 ​编辑 2.2 登录管理控制台 2.3 进入Bucket 2.4、在阿里云网站上的个人中心配置Accesskey,查询accessKeyId和accessKeySecret。 2.5、进入AccssKey管理页面应该会出现下图提示&…

【VI/VIM】基本操作备忘录

简介 新建/打开文件 工作模式 常用命令 移动命令 文本选中 撤销、删除 复制粘贴 替换 缩排 查找 替换 插入 分屏 练习

【动态规划】C++简单多状态dp问题(打家劫舍、粉刷房子、买卖股票的最佳时机...)

文章目录 前言1. 前言 - 理解动态规划算法2. 关于 简单多状态的dp问题2.5 例题按摩师/打家劫舍 3. 算法题3.1_打家劫舍II3.2_删除并获得点数3.3_粉刷房子3.4_买卖股票的最佳时机含冷冻期3.5_买卖股票的最佳时机含手续费3.6_买卖股票的最佳时机III3.7_买卖股票的最佳时机IV 前言…

交换机的种类有哪些?主要都具有哪些作用?

在当今数字化时代,网络已经成为我们生活和工作中不可或缺的一部分。无论是家庭网络还是企业网络,都需要有效的网络设备来实现数据通信和资源共享。而网络交换机作为一种重要的网络设备,扮演着连接和管理网络设备的关键角色。本文将探讨交换机…

开源贡献代码之​探索一下CPython

探索一下Cython 本篇文章将会围绕最近给Apache提的一个feature为背景,展开讲讲CPython遇到的问题,以及尝试自己从0写一个库出来,代码也已经放星球了,感兴趣的同学可以去下载学习。 0.背景 最近在给apache arrow提的一个feature因为…

《TinyLlama: An Open-Source Small Language Model》全文翻译

【Title】 TinyLlama:开源小语言模型 【Abstract】 我们推出了 TinyLlama,这是一个紧凑的 1.1B 语言模型,在大约 1 万亿个令牌上进行了大约 3 个时期的预训练。 TinyLlama 基于 Llama 2(Touvron 等人,2023b&#xff…

VUE项目使用.env配置多种环境以及如何加载环境

第一步,创建多个环境配置文件 Vue CLI 项目默认使用 .env 文件来定义环境变量。你可以通过创建不同的 .env 文件来为不同环境设置不同的环境变量,例如: .env —— 所有模式共用.env.local —— 所有模式共用,但不会被 git 提交&…

C语言 三目运算符

C语言 逻辑分支语句中 还有一种 三目运算符 我们编写代码如下 #include <stdio.h>int main() {const char* a 1 1 ? "表达式1" : "表达式2";printf("%s", a);return 0; }这里 我们根据逻辑 先定义一个a 然后 它的值 等于一个 三目运算…

【CodeGeeX】国产的免费AI编程助手

CodeGeeX&#xff08;官网&#xff1a;https://codegeex.cn/&#xff09;是一款基于大模型的全能的智能编程助手。它可以实现代码的生成与补全、自动添加注释、代码翻译以及智能问答等功能&#xff0c;能够帮助开发者显著提高工作效率。CodeGeeX支持主流的编程语言&#xff0c;…

C++练级之路——类和对象(下)

目录 1、构造函数初始化列表 2、类型转换 3、explicit关键字 4、static成员 5、友元 友元函数 友元类 6、内部类 7、匿名对象 8、拷贝构造时的一些编译器优化 差不多结束了&#xff0c;类和对象&#xff01; 1、构造函数初始化列表 初始化列表&#xff1a;以一个冒号…

python:元组,字符串,切片

一、元组# 列表可以修改内容&#xff0c;元组可以不被修改 # 在程序内封装数据&#xff0c;不希望数据被篡改&#xff0c;所以使用元组 # 语法&#xff1a; 不限制类型 # 定于元组的字面量&#xff1a; &#xff08;元素&#xff0c;元素&#xff0c;元素.....&#xff09; # 定…

萌新_1 环境安装(基于QQNT框架 Python Flask)

遇到问题加QQ群聊 群主在线解答 点击加入群聊【星辰开发】 一&#xff1a;安装QQ 目前为开发&#xff0c;推荐都安装到一台电脑上 直接安装到本地windows电脑&#xff0c; 优点方便开发 一键安装 Windows 用户一键安装方案 https://github.com/super1207/install_llob/rel…

LLMs——扩展数据受限的语言模型解决方案

概述 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;大型语言模型的发展一直是研究的热点。这些模型通过增加参数数量和训练数据量来提升性能&#xff0c;但这种增长趋势是否会有一个极限&#xff1f;实际上&#xff0c;研究者们已经注意到&#xff0c;为了有效地…

大话设计模式-依赖倒转原则

依赖倒转原则 在大话设计模式这本书中&#xff0c;作者通过电话修电脑这个例子引入了面向对象设计的基本原则之一&#xff1a;依赖倒转原则。 概念 依赖倒转原则是面向对象设计的基本原则之一&#xff0c;它用于减少类之间的耦合&#xff0c;提高系统的灵活性和可维护性。在…

QT C++ sqlite 对多个数据库的操作

//本文描述&#xff0c;QT 对多数据库的操作。 //你可能会想&#xff0c;多数据库的操作时&#xff0c;查询语句怎么知道是哪个数据库。 //QT提供了这样一种构造函数 QSqlQuery(const QSqlDatabase &db) //指定数据库 //在QT6.2.4 MSVC2019调试通过。 //效果见下图&am…

Docker(二)Docker+ server部署极简前端页面

本篇文章介绍如何使用 Dockerserver 将一个极简前端页面进行部署 1.本地运行一个简单的前端页面&#xff0c;再把它部署到服务器上 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&quo…

prompt问题【中间不好】

问题1:longchain 关键词在中间容易被忽略掉 Found in the Middle: How Language Models Use Long Contexts Better via Plug-and-Play Positional Encoding 论文对大模型在长文本情况下的性能做了一系列实验研究&#xff0c;发现了一个有趣的“Lost in the middle”现象&#x…

贴片 AMC1200BDWVR 封装 SOIC-8 隔离放大器IC芯片

AMC1200BDWVR的应用领域相当广泛&#xff0c;主要涵盖以下几个方面&#xff1a; 工业控制&#xff1a;在工业自动化系统中&#xff0c;AMC1200BDWVR可用于精确地检测和控制电流&#xff0c;例如在电机驱动和电力转换系统中。 电源管理&#xff1a;该器件适用于各种电源系统&a…

【昇腾产品应用】英码科技EA500I基于昇腾Mind SDK实现实时人体关键点检测

在教育、体育、安防、交通、医疗等领域中&#xff0c;实时人体关键点检测应用发挥着至关重要的作用&#xff0c;比如在体育训练时&#xff0c;实时人体关键点检测可以精确、实时地捕捉运动员的动作&#xff0c;从而进行动作分析和优化&#xff1b;在安防应用场景中&#xff0c;…

Vue3:响应式数据的基本使用(ref、reactive)

一、前言 在Vue3中&#xff0c;如果数据不是响应式数据&#xff0c;当数据的值发生改变时&#xff0c;页面上的数据是不会发生改变的。因此本文主要介绍Vue3中响应式数据的使用&#xff0c;包括ref和reactive的基本使用。 二、ref 1、ref —— 创建基本类型的响应式数据 re…