【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.xdnf.cn/news/1473923.html

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

相关文章

力扣5----最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例 2: 输入:s "cbbd" 输出…

Ad-hoc命令和模块简介

华子目录 Ad-hoc命令和模块简介1.概念2.格式3.Ansible命令常用参数4.模块类型4.1 三种模块类型4.2Ansible核心模块和附加模块 示例1示例2 Ad-hoc命令和模块简介 1.概念 Ansible提供两种方式去完成任务,一是ad-hoc命令,一是写Ansible playbook(剧本)Ad-…

12--RabbitMQ消息队列

前言:前面一章内容太多,写了kafka,这里就写一下同类产品rabbitmq,rabbitmq内容较少,正好用来过度一下,概念还是会用一些例子来说明,实际部署的内容会放在概念之后。 1、基础概念 1.1、MQ消息队…

maven的卸载与安装

卸载 1.找到当前的maven路径:使用 mvn -v 查看当前maven的安装目录在哪 2.删掉 sudo rm -rf [maven的路径] 3.再次输入 mvn -v 查看是否删除成功 安装 1.下载maven安装包 https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/ 注意:maven版本请使用3.…

统计是一门艺术(非参数假设检验)

1.定义 当总体分布未知,那么就需要一种与分布具体数学形式无关的统计推断方法,称为非参数方法 只能利用样本中的一般信息包括位置和次序关系等 稳健性强 2.符号检验 考虑问题: 小样本情况: 以概率为1/2的二项分布是对称的 两…

海外发稿: 秘鲁-区块链新闻媒体通稿宣发

秘鲁媒体单发 随着全球化的不断深入,海外发稿已经成为众多企业宣传推广的重要方式之一。而在海外发稿的选择中,秘鲁媒体的地位尤为重要。秘鲁作为南美洲的重要国家之一,拥有众多知名媒体平台,包括diariodelcusco、serperuano、el…

项目实战-MySQL极佳优化方案---前缀索引

一、应用背景 由于公司项目数据量较大,开发小程序和APP过程中,SQL查询超过1.5s以上的等待时间,因此需要对SQL或者数据表结构设计进行优化。就不讲SQL语句优化啦,而是记录一下数据表结构设计优化的前缀索引实现。 二、MySQL索引 …

java基础--异常 笔记分享

异常 Java异常简介 什么是异常? 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时,是任程序自生自灭,立刻退出终止。在Java中即,Java在编译或…

Java中线程的常用方法(并发编程基础)

Java中线程的常用方法 sleep 调用sleep会让当前线程从Running进入TIMED WAITING状态其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时sleep方法会抛出InterruptedException睡眠结束后的线程未必会立刻得到执行建议用TimeUnit的sleep代替Thread的sleep来获得更好的可读…

昇思25天学习打卡营第08天 | 模型训练

昇思25天学习打卡营第08天 | 模型训练 文章目录 昇思25天学习打卡营第08天 | 模型训练超参数损失函数优化器优化过程 训练与评估总结打卡 模型训练一般遵循四个步骤: 构建数据集定义神经网络模型定义超参数、损失函数和优化器输入数据集进行训练和评估 构建数据集和…

【致知功夫 各随分限】成长需要时间,助人须考虑对方的承受程度

帮助他人需考虑各人的分限所能及的,初学圣学需时间沉淀,存养心性 任何人都应该受到教育,不应受到贫富、贵贱的差异而排除在教育之外,对于不同材质的学生,需要因材施教; 每天都有新的认知,大我…

基于工业互联网的智慧矿山解决方案PPT(38页)

文章摘要 工业互联网与智慧矿山 基于工业互联网的新一代智慧矿山解决方案,将互联网和新一代IT技术与工业系统深度融合,形成关键的产业和应用生态,推动工业智能化发展。该方案以“四级、三层、两网、一平台”为总体框架,强调应用目…

[Vite]Vite插件生命周期了解

[Vite]Vite插件生命周期了解 Chunk和Bundle的概念 Chunk: 在 Vite 中,chunk 通常指的是应用程序中的一个代码片段,它是通过 Rollup 或其他打包工具在构建过程中生成的。每个 chunk 通常包含应用程序的一部分逻辑,可能是一个路由视…

2024菜鸟春招笔试

第一题 解题思路: 签到题,把帖子按好评度降序排列,再将人按升序排列。 第二题 解题思路 从左到右遍历,如果当前元素没有错排,将其与后一个交换,这样两个元素一定都错排。 第三题 、 解题思路 这题当时暴力…

智能运维场景探索 | 运营分析

【本场景来源于 擎创科技《一体化数智运维AIOps解决方案》白皮书,经过重新编写】 该场景主要围绕生产运行、运营决策两个维度进行展开,通过对配置、性能、业务等运行数据的加工计算,形成可量化运营效果、可衡量发展方向的运营数据。整体以低…

陈志泊主编《数据库原理及应用教程第4版微课版》的实验题目参考答案实验2

实验目的 1.掌握在SQL Server中使用对象资源管理器和SQL命令创建数据库与修改数据库的方法。 2.掌握在SQL Server中使用对象资源管理器或者SQL命令创建数据表和修改数据表的方 法(以SQL命令为重点)。 实验设备 操作系统:Win11…

CV03_mAP计算以及COCO评价标准

COCO数据集回顾:CV02_超强数据集:MSCOCO数据集的简单介绍-CSDN博客 1.1 简介 在目标检测领域中,mAP(mean Average Precision,平均精度均值)是一个广泛使用的性能评估指标,用于衡量目标检测模型…

MongoDB集群搭建-最简单

目录 前言 一、分片概念 二、搭建集群的步骤 总结 前言 MongoDB分片(Sharding)是一种水平扩展数据库的方法,它允许将数据分散存储在多个服务器上,从而提高数据库的存储容量和处理能力。分片是MongoDB为了应对大数据量和高吞吐量需…

创新引领未来,智慧水利在路上:数字孪生技术为水库管理开辟新机遇,带来新挑战,引领水利行业迈向智能化新纪元

目录 前言 一、数字孪生技术概述 二、新机遇:数字孪生技术如何重塑水库管理 1、精准预测,科学调度 2、智能监测,及时预警 3、优化资源配置,提升管理效率 4、促进公众参与,增强透明度 三、新挑战:数字…

Fill - UVA 10603

网址如下&#xff1a; Fill - UVA 10603 - Virtual Judge (vjudge.net) 感觉有点浮躁&#xff0c;没法完全将思绪投入题的思考中 脑袋糊糊的 一道bfs题 代码如下&#xff1a; #include<queue> #include<cstdio> #include<cstring> #include<vector&g…