【IT领域新生必看】 Java编程中的重写(Overriding)规则:初学者轻松掌握的全方位指南

文章目录

    • 引言
    • 什么是方法重写(Overriding)?
      • 方法重写的基本示例
    • 方法重写的规则
      • 1. 方法签名必须相同
        • 示例:
      • 2. 返回类型可以是子类型(协变返回类型)
        • 示例:
      • 3. 访问修饰符不能比父类的更严格
        • 示例:
      • 4. 不能抛出新的或更广泛的检查型异常
        • 示例:
      • 5. 使用`@Override`注解
        • 示例:
      • 6. 构造方法不能被重写
        • 示例:
    • 方法重写的应用场景
      • 1. 实现多态性
        • 示例:
      • 2. 提供特定实现
        • 示例:
      • 3. 改进父类方法
        • 示例:
    • 重写的最佳实践
      • 1. 始终使用`@Override`注解
        • 示例:
      • 2. 遵循Liskov替换原则
        • 示例:
      • 3. 维护方法契约
        • 示例:
      • 4. 避免过度重写
        • 示例:
    • 总结

在这里插入图片描述

引言

在Java编程中,重写(Overriding)是一个重要的概念。它允许子类重新定义父类的方法,从而实现多态性和灵活的代码设计。理解并掌握重写规则,对于编写健壮和可维护的代码至关重要。对于初学者来说,了解重写的基本规则和最佳实践,是成为Java编程高手的关键一步。本篇文章将详细介绍Java中的重写规则,帮助你全面理解这一重要概念。

什么是方法重写(Overriding)?

方法重写是指子类提供了一个与父类在方法签名(包括方法名、参数类型和参数个数)完全相同的方法。重写的方法覆盖了父类的方法,从而使子类可以根据需要提供特定的实现。

方法重写的基本示例

class Animal {public void makeSound() {System.out.println("Animal makes a sound");}
}class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("Dog barks");}
}public class Main {public static void main(String[] args) {Animal myDog = new Dog();myDog.makeSound();  // 输出:Dog barks}
}

在上述示例中,Dog类重写了Animal类的makeSound方法。当调用myDog.makeSound()时,执行的是Dog类中的实现,而不是Animal类中的实现。

方法重写的规则

1. 方法签名必须相同

重写的方法必须与被重写的方法具有相同的方法名、参数列表和返回类型。

示例:
class Parent {public void display(String message) {System.out.println("Parent: " + message);}
}class Child extends Parent {@Overridepublic void display(String message) {System.out.println("Child: " + message);}
}

2. 返回类型可以是子类型(协变返回类型)

重写的方法的返回类型可以是被重写方法返回类型的子类型。

示例:
class Animal {public Animal create() {return new Animal();}
}class Dog extends Animal {@Overridepublic Dog create() {return new Dog();}
}

在上述示例中,Dog类的create方法返回Dog类型,这是Animal类型的子类型。

3. 访问修饰符不能比父类的更严格

重写的方法不能具有更严格的访问权限。如果父类方法是public,那么子类方法也必须是public

示例:
class Parent {public void show() {System.out.println("Parent");}
}class Child extends Parent {@Overridepublic void show() {System.out.println("Child");}
}

4. 不能抛出新的或更广泛的检查型异常

重写的方法不能抛出新的或更广泛的检查型异常,但可以抛出更少或更具体的异常。

示例:
class Parent {public void readFile() throws IOException {// 读取文件}
}class Child extends Parent {@Overridepublic void readFile() throws FileNotFoundException {// 读取文件}
}

在上述示例中,Child类的readFile方法抛出了更具体的异常FileNotFoundException,这是允许的。

5. 使用@Override注解

虽然@Override注解不是强制性的,但使用它可以帮助编译器检查方法是否正确地重写了父类的方法,从而避免一些常见错误。

示例:
class Parent {public void greet() {System.out.println("Hello from Parent");}
}class Child extends Parent {@Overridepublic void greet() {System.out.println("Hello from Child");}
}

6. 构造方法不能被重写

构造方法不能被重写,因为它们在类实例化时由JVM调用,而不是通过方法调用。

示例:
class Parent {public Parent() {System.out.println("Parent constructor");}
}class Child extends Parent {public Child() {super();System.out.println("Child constructor");}
}

在上述示例中,Child类不能重写Parent类的构造方法,但可以在自己的构造方法中调用super()来显式调用父类的构造方法。

方法重写的应用场景

1. 实现多态性

重写是实现多态性的重要手段。多态性允许我们通过父类引用调用子类的方法,从而实现更灵活和可扩展的代码。

示例:
class Animal {public void makeSound() {System.out.println("Animal makes a sound");}
}class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("Cat meows");}
}class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("Dog barks");}
}public class Main {public static void main(String[] args) {Animal myCat = new Cat();Animal myDog = new Dog();myCat.makeSound();  // 输出:Cat meowsmyDog.makeSound();  // 输出:Dog barks}
}

2. 提供特定实现

通过重写,子类可以根据自己的需要提供特定的实现,而不是使用父类的通用实现。

示例:
class Shape {public void draw() {System.out.println("Drawing a shape");}
}class Circle extends Shape {@Overridepublic void draw() {System.out.println("Drawing a circle");}
}class Rectangle extends Shape {@Overridepublic void draw() {System.out.println("Drawing a rectangle");}
}public class Main {public static void main(String[] args) {Shape myCircle = new Circle();Shape myRectangle = new Rectangle();myCircle.draw();  // 输出:Drawing a circlemyRectangle.draw();  // 输出:Drawing a rectangle}
}

3. 改进父类方法

子类可以重写父类的方法,以便改进或增强其功能。

示例:
class Calculator {public int add(int a, int b) {return a + b;}
}class AdvancedCalculator extends Calculator {@Overridepublic int add(int a, int b) {int sum = super.add(a, b);System.out.println("Sum is: " + sum);return sum;}
}public class Main {public static void main(String[] args) {AdvancedCalculator calculator = new AdvancedCalculator();calculator.add(3, 4);  // 输出:Sum is: 7}
}

重写的最佳实践

1. 始终使用@Override注解

使用@Override注解可以帮助编译器检查方法是否正确地重写了父类的方法,从而避免拼写错误或参数类型不匹配等问题。

示例:
class Parent {public void display() {System.out.println("Parent display");}
}class Child extends Parent {@Overridepublic void display() {System.out.println("Child display");}
}

2. 遵循Liskov替换原则

Liskov替换原则要求子类应该可以替换父类,并且程序的行为不会改变。重写方法时应确保不改变方法的预期行为。

示例:
class Bird {public void fly() {System.out.println("Bird is flying");}
}class Penguin extends Bird {@Overridepublic void fly() {throw new UnsupportedOperationException("Penguins can't fly");}
}

在上述示例中,Penguin类违反了Liskov替换原则,因为它不能替换Bird类。

3. 维护方法契约

重写的方法应该维护父类方法的契约,包括方法的签名、返回类型和抛出的异常。确保重写的方法在功能上与父类方法一致。

示例:
class Parent {public void process() throws IOException {// 处理逻辑}
}class Child extends Parent {@Overridepublic void process() throws FileNotFoundException {// 处理逻辑}
}

在上述示例中,Child类的process方法重写了父类的方法,并抛出了一个更具体的异常FileNotFoundException

4. 避免过度重写

尽量避免过度重写父类的方法,保持代码简洁。如果父类的方法已经满足需求,不需要重写。

示例:
class Vehicle {public void start() {System.out.println("Vehicle isstarting");}
}class Car extends Vehicle {@Overridepublic void start() {super.start();  // 保持父类行为System.out.println("Car is starting");}
}

总结

重写(Overriding)是Java编程中一个强大的功能,它允许子类重新定义父类的方法,从而实现多态性和灵活的代码设计。通过本文的介绍,你应该对Java中的重写规则有了全面的了解。希望你在编程的学习过程中不断进步,成为一名出色的程序员!

无论你是在实现多态性、提供特定实现,还是改进父类方法,记住遵循重写的规则和最佳实践,这将使你的代码更加高效、可读和可靠。祝你编程愉快!

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

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

相关文章

WordPress子比主题美化文章顶部添加百度收录按钮

要在WordPress子主题中美化文章顶部并添加百度收录按钮,你可以按照以下步骤操作: 首先,确保你的主题支持自定义CSS。如果不支持,你需要在主题目录下创建一个名为style.css的文件,并将以下代码复制到该文件中。如果你的…

全网最详细的appium 自动化测试iOS(二)

一、环境准备: 1、安装appium 2、xcode (appium 版本:12.1.0 xcode版本:12.5 可正常运行,ps:appium 版本:12.1.0 xcode版本:13.0 一直报奇奇怪怪的错误) 3、依赖工具包安装 brew install…

VSCode设置字体大小

方法1:Ctrl 和 Ctrl -,可以控制整个VSCode界面的整体缩放,但是不会调整字体大小 方法2:该方法只能设置编辑器界面的字号,无法改变窗口界面的字号。 (1)点开左下角如下图标,进入…

谷粒商城学习笔记-15-数据库初始化

文章目录 一,创建数据库1,数据库名称2,创建数据库 二,创建表1,仓储模块建表2,订单模块建表3,商品模块建表4,优惠券模块建表5,会员模块建表6,DBeaver批量执行S…

小白 | Linux安装python3

一、更新包列表 首先,确保你的包管理器是最新的: sudo apt update 二、安装 Python 3 安装 Python 3 以及常用的开发工具 sudo apt install python3 python3-pip python3-venv 三、验证安装 python3 --version

FreeRTOS——事件标志组

一、事件标志组 前面所介绍的队列、信号量,只能实现与单个任务进行同步。而有时候某个任务可能需要与多个事件或任务进行同步,此时,事件标志组的作用就凸显出来 1.1 事件标志组简介 事件标志位:用一个位,来表示事件是…

二、Spring

二、Spring 1、Spring简介 1.1、Spring概述 官网地址:https://spring.io/ Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Jav…

密码学及其应用 —— 密码学的经典问题

1. 古典密码学问题 1.1 问题1:破解凯撒密码 1.1.1 问题 凯撒密码是最简单的单字母替换加密方案。这是一种通过将字母表中的字母固定向右移动几位来实现的加密方法。解密下面的文本,该文本通过对一个去除了空格的法语文本应用凯撒密码获得: …

ruoyi mybatis pagehelper 分页优化(自定义limit位置)clickhouse 外部数据源

例如加入clickhouse的分页时发现extends 不生效 则可以添加 startPage();registerDialectAlias("clickhouse", PageMySqlDialectPlus.class);List<MyMonitorlog> list monitorlogService.selectMonitorlogList(monitorlog);主要是需要注册 registerDialectAl…

js获取当前浏览器地址,ip,端口号等等

前言&#xff1a; js获取当前浏览器地址&#xff0c;ip&#xff0c;端口号等等 window.location属性查询 具体属性&#xff1a; 1、获取他的ip地址 window.location.hostname 2、获取他的端口号 window.location.port 3、获取他的全路径 window.location.origin 4、获取…

认识异常详解

1. 异常的定义&#xff1a; 在Java中&#xff0c;异常&#xff08;Exception&#xff09;是在程序执行过程中可能出现的错误或意外情况。异常可以分为两种类型&#xff1a;受检异常&#xff08;Checked Exception&#xff09;和未受检异常&#xff08;Unchecked Exception&…

【linux学习---1】点亮一个LED是多么的困难!!!

文章目录 1、原理图找对应引脚2、IO复用3、IO配置4、GPIO配置5、GPIO时钟使能6、总结7、编程8、编译9、链接10、格式转换11、反汇编&#xff08;查看用&#xff09;12、使用Makefile操作13、代码烧写14、代码验证 1、原理图找对应引脚 从上图 可以看出&#xff0c; 蜂鸣器 接到…

固态,机械,移动(U盘),sd卡,哪个更适合长期储存数据 保存数据用什么硬盘可靠 硬盘数据丢失怎么找回 硬盘维护注意事项

有关硬盘数据丢失的恢复技巧&#xff0c;这篇文章一定要收藏好。在硬盘使用过程中&#xff0c;很多情况都会导致数据丢失&#xff0c;例如硬盘跌落、病毒感染、系统文件损坏等。这时候&#xff0c;一定要采用正确的方法&#xff0c;抢救硬盘中存储的珍贵数据和文档。 有关长期保…

PO模式简介

V1顺序型&#xff1a;不能批量运行 import unittest from selenium import webdriver from time import sleep driver webdriver.Edge()# driver.maximize_window() driver.implicitly_wait(30) # driver.get(r"https://demo5.tp-shop.cn/") # driver.find_element…

Python 获取tiktok视频评论回复数据 api接口

TIKTOK api接口 用于爬取tiktok视频评论回复数据 详细采集页面如图 https://www.tiktok.com/dailymail/video/7329872821990182190?qneural%20link&t1706783508149 请求API http://api.xxxx.com/tt/video/info/comment/reply?video_id7288909913185701125&comment_…

【C++】指针的点运算与箭头运算(->)的奥秘与应用

在编程的世界里&#xff0c;指针作为连接程序与内存之间的桥梁&#xff0c;扮演着至关重要的角色。对于使用C、C等语言进行开发的程序员而言&#xff0c;理解并掌握指针的使用技巧是提升编程能力的必经之路。其中&#xff0c;指针的点运算&#xff08;.&#xff09;和箭头运算&…

Android系统集成和使用FFmpeg

文章目录 前言FFmpeg源码下载交叉编译NDK下载x264编译源码下载编译 FFmpeg编译脚本 AOSP继承FFmpeg 前言 原生AOSP中并未继承FFmpeg&#xff0c;所以要想在android上使用&#xff0c;需要自己编译集成。 FFmpeg源码下载 git clone https://git.ffmpeg.org/ffmpeg.git目前最新…

自动化测试报告pytest-html样式美化

最近我将 pytest-html 样式优化了 一版 先看优化前&#xff1a; 优化后&#xff1a; 优化内容包括&#xff1a; 删除部分多余字段新增echart图表部分字体大小、行间距、颜色做了美化调整运行环境信息移至报告最后部分字段做了汉化处理&#xff08;没全部翻译是因为&#xf…

vue3 引入百度地图的三种方式

本次也是正好写了一个基于VUE3和百度地图的设计&#xff0c;但奈何第一次使用百度地图&#xff0c;在学习的途中遇到了很多问题&#xff0c;也发现网上的材料相对较少&#xff0c;因此做出了一些小总结&#xff0c;后续还会更新。 一、直接引入 直接在public中的index.html中进…

[FreeRTOS 功能应用] 事件组 功能应用

文章目录 一、基础知识点二、代码讲解三、结果演示四、代码下载 一、基础知识点 [FreeRTOS 基础知识] 事件组 概念 [FreeRTOS 内部实现] 事件组 本实验是基于STM32F103开发移植FreeRTOS实时操作系统&#xff0c;事件组实战操作。(当task1和task2同时完成&#xff0c;才执行ta…