一篇文章带你彻底搞懂方法重写(override)和重载(overload)—菜鸟教程学习记录

news2024/9/24 7:19:37

一篇文章带你彻底搞懂方法重写(override)和重载(overload)

​ 这个其实我们在之前的java方法那一章节里面就提到了,这里更加深入一下,并且提供具体的例子。

重写(Override)基本概念:

​ Java方法**重写(Override)**指的是,子类对父类的允许访问的方法(非private修饰的)的实现过程进行重新编写, 返回值和形参都不能改变。相同的方法名,相同的形参,相同的返回值,但是方法体的内容不同,”外壳不变,核心重写“


重写的好处:

​ 可以根据子类需要,定义特定于子类自己的行为。 也就是说子类能够根据需要实现父类的方法。简单打个比方,父类:动物,嘎嘎叫方法。子类:狗,嘎嘎叫方法(输出:汪汪汪)

需要注意的点有:

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

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

package main.method方法;

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

class Dog extends Animal{
    public void move(){
        System.out.println("狗可以跑和走");
    }
    public void mark(){
        System.out.println("狗狗撒尿作为领地占有的标志");
    }
}

public class Test{
    public static void main(String args[]){
        Animal a = new Animal(); // Animal 对象
        Animal b = new Dog(); // Dog 对象 向下转型
        a.move();// 执行 Animal 类的方法
        b.move();//执行 Dog 类的方法
         //b.mark();//这样会报错,因为b的引用类型Animal没有mark(),除非你在Animal中编写一个mark()方法,又或者说进行一个强制类型转换,把Animal类型的b转换为含有mark()方法的Dog类型即(Dog) b。
        ((Dog)b).mark();//调用子类Dog独有的方法之前要进行强制类型转换,即(Dog) b。
       
    }
}

以上实例编译运行结果如下:

动物可以移动
狗可以跑和走
狗狗撒尿作为领地占有的标志    

方法的重写规则

  • 参数列表与被重写方法的参数列表必须完全相同。
  • **返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(“java5 及更早版本返回类型要一样,java7 及更高版本可以不同”)。**简单举例:父类Animal的mark方法返回的是Animal对象,而子类Dog的mark方法可以返回的是Dog对象。”子类方法返回 Dog 类型,是 Animal 的子类型
  • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
  • 父类的成员方法只能被它的子类重写。
  • 声明为 final 的方法不能被重写。
  • 声明为 static 的方法不能被重写,但是能够被再次声明。
  • 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。(即默认访问修饰符default、public公共的、protected受保护的)
  • 子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。(没有被显示指定访问修饰符的”dafault的方法,在不同包的子类中无法被重写“)
  • 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
  • 构造方法不能被重写。
  • 如果不能继承一个类,则不能重写该类的方法。
小结:重写(Override)体现的是父类和子类之间多态的一种表现

Super 关键字的使用

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


重载(Overlode)基本概念:

方法重载(Method Overloading)是指在”同一个类“中定义多个名称相同但参数列表不同的方法。


方法重载的特点如下:
  • 方法名称必须相同。
  • 方法的参数列表必须不同,要么是参数的类型不同,要么是参数的数量不同,要么是参数的顺序不同。
  • 方法的返回类型可以相同也可以不同。
  • 方法重载与方法的访问修饰符、异常类型等无关

​ 通过方法重载,我们可以使用相同的方法名称来实现不同的行为,方便了代码的复用和可读性。

以下是一个方法重载的示例:

public 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;
    }
}

在上面的例子中,Calculator 类定义了三个名为 add 的方法,它们的参数列表分别为 (int, int)(int, int, int)(double, double)。这样,我们可以根据需要使用不同的参数调用适合的 add 方法。

例如:

Calculator cal = new Calculator();
int result1 = cal.add(2, 3); // 调用 add(int, int) 方法
int result2 = cal.add(2, 3, 4); // 调用 add(int, int, int) 方法
double result3 = cal.add(2.5, 3.7); // 调用 add(double, double) 方法

通过方法重载,我们可以为同一方法名称提供多种不同参数的实现,以便于适应实际开发中我们遇到的各种不同的使用情况和需求。

重载是一个类的多态性具体表现形式


重写与重载之间的区别

区别点重载方法重写方法
参数列表必须修改一定不能修改
返回类型可以修改一定不能修改
异常可以修改可以减少或删除,一定不能抛出新的或者更广的异常
访问可以修改一定不能做更严格的限制(可以降低限制)

总结

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

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

img

img

结尾语:记录于2023年8月2号0时46分,以上仅为个人在[Java Override和Overload](Java 重写(Override)与重载(Overload) | 菜鸟教程 (runoob.com))的学习过程中遇到的问题,还有记录的个人想法,有错误欢迎指出,希望对您有帮助,感谢观看!如果可以的话,点点赞,点点关注

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

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

相关文章

02 笔记本电脑m.2硬盘更换

1 工具展示 SN570的2T硬盘。够用了。 对于这台华为,使用的螺丝刀批头是4或5毫米的六边形批头。如果出现打滑的情况,请不要用蛮力哦。 2 更换过程 使用螺丝刀拧走后盖的螺丝(为了避免会出问题要再次打开,我到现在还没有把螺丝拧回…

groovy.lang.GroovyRuntimeException:Ambiguous method

目录 问题 根因及解决 问题 今天线上的计算脚本报了个问题,报警如下是 groovy 运行时异常。调用方法 org.springframework.util.CollectionUtils#isEmpty 出现了异常。异常原因是由于方法重载造成了歧义。无法确定如何调用方法 [null],因为它同时匹配了…

如何隐藏开源流媒体EasyPlayer.js视频H.265播放器的实时录像按钮?

目前我们TSINGSEE青犀视频所有的视频监控平台,集成的都是EasyPlayer.js版播放器,它属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,包括WebSocket-FLV、HTTP-FLV,HLS(m3u8&#x…

Stable diffusion 三大基础脚本 提示词矩阵,载入提示词,XYZ图表讲解

目录 0.本章讲解 1.提示词矩阵(prompt matrix) 1.2.提示词矩阵功能选项 1.2.1.把可变部分放在提示词文本的开头 1.2.2.为每张图片使用不同随机种子 1.2.3.选择提示词 1.2.4.选择分割符 1.2.5.宫格图边框(像素) 2.从文本框或文件载入提示词(Pro…

0基础学习VR全景平台篇 第75篇:多现场

多现场是指将多台设备的直播画面整合到一个直播活动链接里面,让用户自行选择切换要看哪个直播画面的功能。既可以是同一个活动的不同角度直播,也可以是异地的直播。多现场不需要导播台,并且可以同时支持平面直播和VR直播的混合切换。多现场仅…

excel中使地址按十六进制进行数值递增的函数

这里是尼德兰的喵工具相关文章,欢迎您的访问! 如果文章对您有所帮助,期待您的点赞收藏! 让我们一起为成为芯片前端全栈工程师而努力! 在进行寄存器编写时很多时候会涉及到算地址的问题,通常32bit位宽的寄存…

Gin框架使用

Gin Gin框架安装与使用 下载安装Gin: go get -u github.com/gin-gonic/gin使用示例: package mainimport "github.com/gin-gonic/gin"func main() {//创建一个默认的路由引擎r : gin.Default()//GET:请求方式,/hello:请求路径/…

Vivado进行自定义IP封装

一. 简介 本篇文章将介绍如何使用Vivado来对上篇文章(FPGA驱动SPI屏幕)中的代码进行一个IP封装,Vivado自带的IP核应该都使用过,非常方便。 这里将其封装成IP核的目的主要是为了后续项目的调用,否则当我新建一个项目的时候,我需要将…

实现 rollup 实现多模块打包

rollup 是一个 JavaScript 模块打包器,可以将许多 JavaScript 库和应用程序打包成少量的捆绑包,从而提高了应用程序的性能。本文详细描述如何通过 rollup 实现多模块打包。 前提 项目的目录结构 先看下项目的 package.json 文件夹: {&qu…

LLaMA系列 | LLaMA和LLaMA-2精简总结

文章目录 1、LLaMA1.1、模型结构1.2、训练方式1.3、结论 2、LLaMA-22.1、相比LLaMA1的升级2.3、模型结构2.3.1、MHA, MQA, GQA区别与联系 2.4、训练方式 1、LLaMA 🔥 纯基座语言模型 《LLaMA: Open and Efficient Foundation Language Models》:https:/…

CS5801国产HDMI转DP/edp(4k60)转换器方案芯片 可替代LT6711

CS5801是HDMI2.0b到DP1.4a转换器方案IC。CS5801 有一个HDMI2.0b .输入,带宽高达18Gbps.它支持辨别率是4k60Hz。对于DP1.4输出,由4条数据通道组成,支持1.62Gbps、 2.7Gbps、 5.4Gbps链路速率。内置可选SSC功能可降低EMI影响。嵌入式MCU基于32位…

3d虚拟vr汽车实景展厅吸引更多潜在消费者

随着人们对生活品质的追求,越来越多的消费者开始关注汽车的外观设计、内饰配置等方面。传统的展示方式已经不能满足消费者的需求,车辆VR虚拟漫游展示应运而生。借助VR虚拟现实和web3d开发建模技术,对汽车的外观、造型及信息数据进行数字化处理…

乳腺癌CT影像数据的深度学习:R语言与ANN神经网络构建高性能分类诊断模型

一、引言 乳腺癌是全球最常见的女性恶性肿瘤之一,也影响着男性的健康。据统计,每年有数百万人被诊断出患有乳腺癌[1]。乳腺癌的早期检测和准确诊断对于治疗和预后至关重要。然而,乳腺癌的早期诊断面临许多挑战,如图像解读的主观性…

第一堂棒球课:MLB全明星发展历程·棒球1号位

MLB全明星发展历程 1. MLB全明星的起源 MLB全明星是什么? MLB全明星,也就是MLB All-Stars,是指美国职业棒球大联盟(Major League Baseball, MLB)在每年举办的全明星赛。这项赛事汇集了全联盟各队的顶级球员&#xff…

InnoDB存储引擎——事务原理

1.什么是事务 2.redo log 脏页是指缓冲区的数据与磁盘中的数据不一致时的状态。脏页的数据并不是实时刷新的,而是一段时间之后通过后台线程把脏页的数据刷线到磁盘,假如说脏页的数据在往磁盘中刷新的时候出错了,内存中的数据没有刷新到磁盘当…

Java8实战-总结11

Java8实战-总结11 Lambda表达式方法引用管中窥豹如何构建方法引用 构造函数引用 Lambda表达式 方法引用 方法引用让你可以重复使用现有的方法定义,并像Lambda一样传递它们。在一些情况下,比起使用Lambda表达式,它们似乎更易读,感…

代码随想录算法训练营第二十九天 | Leetcode随机抽题检测

Leetcode随机抽题检测 160 相交链表未看解答自己编写的青春版重点题解的代码206 反转链表 一段用于复制的标题未看解答自己编写的青春版重点题解的代码日后再次复习重新写 234 回文链表未看解答自己编写的青春版重点综上,利用快慢指针找寻链表中间,就按加…

【C++】总结9

文章目录 C从源代码到可执行程序经过什么步骤静态链接和动态链接类的对象存储空间C的内存分区内存池在成员函数中调用delete this会出现什么问题?如果在类的析构函数中调用delete this,会发生什么? C从源代码到可执行程序经过什么步骤 预处理…

Tomcat 创建https

打开CMD,按下列输入 keytool -genkeypair -alias www.bo.org -keyalg RSA -keystore d:\ambition.keystore -storetype pkcs12 输入密钥库口令:123456 再次输入新口令:123456 您的名字与姓氏是什么? [Unknown]: www.ambition.com 您的组织单位名称是什么? [Unknown…

Qt 编译 Android 项目,输出乱码

乱码如下: :-1: error: 娉 C:\Qt\6.5.0\android_arm64_v8a\src\android\java\src\org\qtproject\qt\android\bindings\QtActivity.java浣跨敤鎴栬鐩栦簡宸茶繃鏃剁殑 API銆 娉 鏈夊叧璇︾粏淇℃伅, 璇蜂娇鐢-Xlint:deprecation 閲嶆柊缂栬瘧銆 正确的应该是&#…