【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 {
    @Override
    public 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 {
    @Override
    public void display(String message) {
        System.out.println("Child: " + message);
    }
}

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

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

示例:
class Animal {
    public Animal create() {
        return new Animal();
    }
}

class Dog extends Animal {
    @Override
    public 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 {
    @Override
    public void show() {
        System.out.println("Child");
    }
}

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

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

示例:
class Parent {
    public void readFile() throws IOException {
        // 读取文件
    }
}

class Child extends Parent {
    @Override
    public 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 {
    @Override
    public 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 {
    @Override
    public void makeSound() {
        System.out.println("Cat meows");
    }
}

class Dog extends Animal {
    @Override
    public 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 meows
        myDog.makeSound();  // 输出:Dog barks
    }
}

2. 提供特定实现

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

示例:
class Shape {
    public void draw() {
        System.out.println("Drawing a shape");
    }
}

class Circle extends Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

class Rectangle extends Shape {
    @Override
    public 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 circle
        myRectangle.draw();  // 输出:Drawing a rectangle
    }
}

3. 改进父类方法

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

示例:
class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

class AdvancedCalculator extends Calculator {
    @Override
    public 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 {
    @Override
    public 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 {
    @Override
    public void fly() {
        throw new UnsupportedOperationException("Penguins can't fly");
    }
}

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

3. 维护方法契约

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

示例:
class Parent {
    public void process() throws IOException {
        // 处理逻辑
    }
}

class Child extends Parent {
    @Override
    public void process() throws FileNotFoundException {
        // 处理逻辑
    }
}

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

4. 避免过度重写

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

示例:
class Vehicle {
    public void start() {
        System.out.println("Vehicle is

 starting");
    }
}

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

总结

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

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

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

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

相关文章

使用京东云主机搭建幻兽帕鲁游戏联机服务器全流程,0基础教程

使用京东云服务器搭建幻兽帕鲁Palworld游戏联机服务器教程,非常简单,京东云推出幻兽帕鲁镜像系统,镜像直接选择幻兽帕鲁镜像即可一键自动部署,不需要手动操作,真正的新手0基础部署幻兽帕鲁,阿腾云整理基于京…

E4.【C语言】练习:while和getchar的理解

#include <stdio.h> int main() {int ch 0;while ((ch getchar()) ! EOF){if (ch < 0 || ch>9)continue;putchar(ch);}return 0; } 理解上述代码 0-->48 9-->57 if行判断是否为数字&#xff0c;打印数字&#xff0c;不打印非数字

纯javascript实现图片批量压缩打包zip下载后端ThinkPHP多国语言切换国际站

最近在做一个多国语言的工具站&#xff0c;需要实现多国语言切换&#xff0c;说到多国语言站&#xff0c;肯定是有2种方式&#xff0c;第一是子域名&#xff0c;第二就是子目录。根据自己的需要来确定。 后台配置如下&#xff1a; 前台显示&#xff1a; 前端纯javascript实现…

torchtext安装后仍无法使用

Pytorch 、 torchtext和Python之间有严格的对应关系&#xff1a; 在安装前需要找到自己要安装的版本&#xff0c;如果直接在命令窗中以如下命令安装torchtext&#xff0c;会出现问题 &#xff1a; pip install torchtext 注意在这种安装方式&#xff0c;如果你的pytorch版本与…

在centos7上部署mysql8.0

1.安装MySQL的话会和MariaDB的文件冲突&#xff0c;所以需要先卸载掉MariaDB。查看是否安装mariadb rpm -qa | grep mariadb 2. 卸载mariadb rpm -e --nodeps 查看到的文件名 3.下载MySQL安装包 MySQL官网下载地址: MySQL :: Download MySQL Community Serverhttps://dev.mys…

【vue动态组件】VUE使用component :is 实现在多个组件间来回切换

VUE使用component :is 实现在多个组件间来回切换 component :is 动态父子组件传值 相关代码实现&#xff1a; <component:is"vuecomponent"></component>import componentA from xxx; import componentB from xxx; import componentC from xxx;switch(…

记一次mysql迁移Kingbase8

目录 一、下载Kingbase工具二、客户端安装三、数据库开发管理工具 KStudio3.1 主界面3.2 导出数据库建表语句DDL3.3 导出数据 四、数据迁移工具 KDTS4.1 启动KDTS4.2 新建源数据库4.3 新建目标数据库4.4 迁移任务管理 一、下载Kingbase工具 kingbase数据库服务&#xff08;内置…

Java启动虚拟机默认字符集编码

-Dfile.encodingUTF-8 java程序启动默认字符集编码参数 // 这里会创建一个Charset.defaultCharset().name()的流&#xff0c;在Windows命令行窗口启动&#xff0c;会出现字符编码为GBK的情况 // 导致乱码输入、输出都会有影响 // 解决办法流的读取指定编码new InputStreamRead…

kettle中调用restful接口时的SSL信任证书问题

1、找第三方获取SSL证书&#xff0c;&#xff08;本案例为自签名证书&#xff09; C:\Program Files\Java\jdk1.8.0_241\jre\lib\security>keytool -import -alias aliyun-maven -keystore cacerts -file E:\entSoftware\aliyun-maven.cer 输入密钥库口令: …………一堆证…

ABAP 发送正文含图片邮件

背景&#xff1a; 客户要求系统发送的邮件内容中含logo图片 解决&#xff1a; 参考outlook中带图片的邮件&#xff0c;有两种形式&#xff0c;一种为url链接&#xff0c;需要点击下载才展示图片&#xff0c;一种为直接显示&#xff1b;如果使用ABAP发送该类型的邮件&#xff0…

Educational Codeforces Round 167(Div.2) A~D

A.Catch the Coin&#xff08;思维&#xff09; 题意&#xff1a; Monocarp 参观了一家有街机柜的复古街机俱乐部。在那里&#xff0c;他对"抓硬币"游戏机产生了好奇。 游戏非常简单。屏幕上的坐标网格是这样的 X X X轴从左到右&#xff1b; Y Y Y轴从下往上&…

Java毕业设计 基于SSM vue新生报到系统小程序 微信小程序

Java毕业设计 基于SSM vue新生报到系统小程序 微信小程序 SSM 新生报到系统小程序 功能介绍 学生 登录 注册 忘记密码 首页 学校公告 录取信息 录取详情 师资力量 教师详情 收藏 评论 用户信息修改 宿舍安排 签到信息 在线缴费 教室分配 我的收藏管理 我要发贴 我的发贴 管理…

海外金融机构银行保险证券数字化转型营销销售数字化成功案例讲师培训师讲授开户销售营销客户AI人工智能创新思维

金融机构需要数字营销的主要原因 数字银行、直接存款和移动网络的兴起让客户无需前往当地分行即可轻松办理银行业务。这些举措不仅提升了用户体验&#xff0c;也迫使银行向数字化世界迈进。 金融服务公司需要在数字营销渠道上保持稳固的地位&#xff0c;以免落后于大型机构。…

罗剑锋的C++实战笔记学习(一):const、智能指针、lambda表达式

1、const 1&#xff09;、常量 const一般的用法就是修饰变量、引用、指针&#xff0c;修饰之后它们就变成了常量&#xff0c;需要注意的是const并未区分出编译期常量和运行期常量&#xff0c;并且const只保证了运行时不直接被修改 一般的情况&#xff0c;const放在左边&…

深度卷积神经网络 AlexNet

一、机器学习深度学习的发展 1、机器学习SVM方法 &#xff08;1&#xff09;20世纪90年代&#xff0c;基于统计学习理论的结果&#xff0c;开发了一种新型的学习算法——支持向量机&#xff08;SVM&#xff09;。这就产生了一类新的理论上优雅的学习机器&#xff0c;它们将SVM…

大厂面试官问我:MySQL宕机重启了,怎么知道哪些事务是需要回滚的哪些是需要提交的?【后端八股文九:Mysql事务八股文合集】

本文为【Mysql事务八股文合集】初版&#xff0c;后续还会进行优化更新&#xff0c;欢迎大家关注交流~ 大家第一眼看到这个标题&#xff0c;不知道心中是否有答案了&#xff1f;在面试当中&#xff0c;面试官经常对项目亮点进行深挖&#xff0c;来考察你对这个项目亮点的理解以及…

2024/7/6 英语每日一段

More than half of late-teens are specifically calling for more youth work that offers “fun”, with older teenagers particularly hankering for more jollity, according to a study carried out by the National Youth Agency. One in 10 said they have zero option…

vite+vue3整合less教程

1、安装依赖 pnpm install -D less less-loader2、定义全局css变量文件 src/assets/css/global.less :root {--public_background_font_Color: red;--publicHouver_background_Color: #fff;--header_background_Color: #fff;--menu_background: #fff; }3、引入less src/main.…

罗剑锋的C++实战笔记学习(二):容器、算法库、多线程

4、容器 1&#xff09;、容器的通用特性 所有容器都具有的一个基本特性&#xff1a;它保存元素采用的是值&#xff08;value&#xff09;语义&#xff0c;也就是说&#xff0c;容器里存储的是元素的拷贝、副本&#xff0c;而不是引用 容器操作元素的很大一块成本就是值的拷贝…

重大更新来袭!!《植物大战僵尸杂交版V2.1+修改器+融合版》

大家好&#xff01;每个软件更新总是令人兴奋不已。前段时间介绍的《植物大战僵尸》系列以其独特的策略玩法和丰富的植物角色&#xff0c;赢得了很多玩家的喜爱。而在今天&#xff0c;这款经典游戏全网最新版本——《植物大战僵尸&#xff1a;杂交版V2.1》正式推出&#xff0c;…