Java 方法重写

news2025/1/22 16:27:35

目录

一、什么是方法重写,为什么需要它

二、方法重写的规则

三、方法重写的实际应用场景

四、方法重写与重载的区别

五、总结


在 Java 编程的精彩世界里,方法重写是一项极为重要且实用的特性,它犹如一把神奇的钥匙,为我们开启了面向对象编程中多态性的大门。掌握方法重写,不仅能让我们的代码更具灵活性和扩展性,还能深刻体会到面向对象编程的魅力所在。今天,就让我们一同深入探索 Java 方法重写的奥秘。

一、什么是方法重写,为什么需要它

简单来说,方法重写就是在子类中重新定义父类中已存在的方法。这一概念源于现实生活中的许多场景。比如,我们有一个 “动物” 类,其中有一个 “发出声音” 的方法。当我们创建 “狗” 类作为 “动物” 类的子类时,狗发出的声音和其他动物是不同的,所以我们在 “狗” 类中重写 “发出声音” 这个方法,让它更符合狗的特性。

在编程中,方法重写主要用于实现多态性。多态性使得我们可以使用父类的引用指向子类的对象,并调用子类重写后的方法,从而实现根据不同的对象类型执行不同的行为。这大大提高了代码的灵活性和可扩展性,避免了大量重复代码的编写。

二、方法重写的规则

方法重写并不是随意进行的,它需要遵循一系列严格的规则。了解并遵守这些规则,是正确实现方法重写的关键。

  1. 方法签名必须相同:子类重写的方法必须与父类被重写的方法具有相同的方法名、参数列表和返回类型(在 Java 5.0 及以上版本,返回类型可以是被重写方法返回类型的子类,这称为协变返回类型)。例如:

class Animal {
    public void makeSound() {
        System.out.println("动物发出声音");
    }
}

class Dog extends Animal {
    // 重写makeSound方法
    public void makeSound() {
        System.out.println("汪汪汪");
    }
}

在这个例子中,Dog类中的makeSound方法与Animal类中的makeSound方法方法名、参数列表都相同,符合方法重写的要求。

  1. 访问修饰符的限制:子类重写的方法不能比父类被重写的方法具有更严格的访问权限。例如,如果父类的方法是public的,子类重写的方法也必须是public;如果父类的方法是protected,子类可以是protectedpublic。如下例:

class Parent {
    protected void display() {
        System.out.println("父类的protected方法");
    }
}

class Child extends Parent {
    // 正确,访问权限更宽松
    public void display() {
        System.out.println("子类的public方法");
    }
}

如果将Child类中display方法的访问修饰符改为private,就会编译错误,因为privateprotected的访问权限更严格。

  1. 不能重写被privatestaticfinal修饰的方法private方法在子类中不可见,所以无法重写;static方法属于类,而不是对象,与实例方法的重写机制不同;final方法不能被重写,因为final表示最终的、不可改变的。例如:

class FinalClass {
    final void finalMethod() {
        System.out.println("这是一个final方法");
    }
}

class SubFinalClass extends FinalClass {
    // 以下代码会导致编译错误,无法重写final方法
    // void finalMethod() {
    //     System.out.println("尝试重写final方法");
    // }
}

三、方法重写的实际应用场景

方法重写在实际编程中有着广泛的应用场景,下面我们通过几个例子来深入了解。

  1. 图形绘制系统:假设有一个Shape类,它有一个draw方法用于绘制图形。然后有Circle类和Rectangle类作为Shape类的子类。在Circle类和Rectangle类中,我们可以重写draw方法,以实现不同图形的绘制逻辑。

abstract class Shape {
    public abstract void draw();
}

class Circle extends Shape {
    @Override
    public void draw() {
        System.out.println("绘制一个圆形");
    }
}

class Rectangle extends Shape {
    @Override
    public void draw() {
        System.out.println("绘制一个矩形");
    }
}

在实际使用时,可以通过多态性来实现根据不同的图形对象调用相应的绘制方法:

public class Main {
    public static void main(String[] args) {
        Shape circle = new Circle();
        Shape rectangle = new Rectangle();

        circle.draw();
        rectangle.draw();
    }
}

  1. 游戏角色行为:在一个游戏开发中,有一个Character类,其中包含一个move方法用于描述角色的移动行为。不同的游戏角色,如Warrior(战士)、Mage(法师)等,它们的移动方式可能不同。我们可以在WarriorMage类中重写move方法,以实现各自独特的移动逻辑。

class Character {
    public void move() {
        System.out.println("角色移动");
    }
}

class Warrior extends Character {
    @Override
    public void move() {
        System.out.println("战士快速奔跑");
    }
}

class Mage extends Character {
    @Override
    public void move() {
        System.out.println("法师瞬移");
    }
}

这样,在游戏中,根据不同的角色类型,就可以调用相应的移动方法,增加游戏的趣味性和真实性。

四、方法重写与重载的区别

在学习方法重写时,很容易与方法重载混淆。虽然它们都涉及方法的定义,但有着本质的区别。

  1. 定义不同:方法重写是子类对父类中已存在方法的重新定义;而方法重载是在同一个类中定义多个方法,这些方法具有相同的方法名,但参数列表不同(参数个数、类型或顺序不同)。
  2. 范围不同:方法重写发生在父子类之间;方法重载发生在同一个类中。
  3. 返回类型和访问修饰符要求不同:方法重写要求返回类型(协变返回类型情况除外)和方法签名必须与父类被重写方法相同,且访问修饰符不能更严格;方法重载与返回类型无关,访问修饰符也没有限制。例如:

class OverloadExample {
    // 方法重载
    public void printInfo(int num) {
        System.out.println("打印整数: " + num);
    }

    public void printInfo(String str) {
        System.out.println("打印字符串: " + str);
    }
}

这里的两个printInfo方法就是方法重载,它们在同一个类中,方法名相同但参数列表不同。

五、总结

方法重写是 Java 面向对象编程中一项强大而灵活的特性,它为我们实现多态性提供了重要手段。通过遵循方法重写的规则,我们可以在子类中根据实际需求重新定义父类的方法,使代码更加符合具体业务场景。同时,我们也了解了方法重写与方法重载的区别,这有助于我们在编程中正确运用这两个概念。在实际项目中,合理利用方法重写能够提高代码的可维护性、可扩展性和复用性。希望大家在今后的 Java 编程中,能够熟练掌握和运用方法重写,创造出更加精彩、高效的程序。如果在学习过程中遇到任何问题,欢迎一起探讨,共同进步。

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

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

相关文章

LAYA3.0 组件装饰器说明

原文 在LayaAirIDE中,如果想在IDE内展示组件脚本的属性,需要通过装饰器的规则来实现。下面分别介绍四种装饰器。 文章目录 一、regClass()二、property()2.1 组件属性的常规使用2.2 属性访问器的装饰器使用2.3 是否序列化保存2.4 组件属性是否在IDE中显…

PostIn安装教程

PostIn是一款国产开源免费的接口管理工具,包含项目管理、接口调试、接口文档设计、接口数据MOCK等模块,支持常见的HTTP协议、websocket协议等,支持免登陆本地接口调试,同时可以对项目进行灵活的成员权限、消息通知管理等。 1、服务…

RabbitMQ--延迟队列

(一)延迟队列 1.概念 延迟队列是一种特殊的队列,消息被发送后,消费者并不会立刻拿到消息,而是等待一段时间后,消费者才可以从这个队列中拿到消息进行消费 2.应用场景 延迟队列的应用场景很多,…

后端面试题分享第一弹(状态码、进程线程、TCPUDP)

后端面试题分享第一弹 1. 如何查看状态码,状态码含义 在Web开发和调试过程中,HTTP状态码是了解请求处理情况的重要工具。 查看状态码的步骤 打开开发者工具: 在大多数浏览器中,您可以通过按下 F12 键或右键单击页面并选择“检查…

网络通信---MCU移植LWIP

使用的MCU型号为STM32F429IGT6,PHY为LAN7820A 目标是通过MCU的ETH给LWIP提供输入输出从而实现基本的Ping应答 OK废话不多说我们直接开始 下载源码 LWIP包源码:lwip源码 -在这里下载 ST官方支持的ETH包:ST-ETH支持包 这里下载 创建工程 …

CSS笔记基础篇02——浮动、标准流、定位、CSS精灵、字体图标

黑马程序员视频地址: 前端Web开发HTML5CSS3移动web视频教程https://www.bilibili.com/video/BV1kM4y127Li?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p70https://www.bilibili.com/video/BV1kM4y127Li?vd_source…

Linux:进程(三)

1. 进程创建补充 fork之后父子两个执行流分别执行,fork之后谁谁先执行由调度器来决定。 一般,父子代码共享。当父子不再写入时,数据也是共享的,但是当有一方要写入,就触发写时拷贝。 fork调用失败的原因 1. 系统中有…

2025年1月21日刷题记录

1.leetcode1768题目 链接:1768. 交替合并字符串 - 力扣(LeetCode) 代码: class Solution { public:string mergeAlternately(string word1, string word2) {string word3;int a word1.size(), b word2.size();int i 0, j 0…

Mysql触发器(学习自用)

一、介绍 二、触发器语法 注意:拿取新的数据时用new,旧数据用old。

wireshark工具简介

目录 1 wireshark介绍 2 wireshark抓包流程 2.1 选择网卡 2.2 停止抓包 2.3 保存数据 3 wireshark过滤器设置 3.1 显示过滤器的设置 3.2 抓包过滤器 4 wireshark的封包列表与封包详情 4.1 封包列表 4.2 封包详情 参考文献 1 wireshark介绍 wireshark是非常流行的网络…

「2024·我的成长之路」:年终反思与展望

文章目录 1. 前言2.创作历程2.1 摆烂期2.2 转变期3. 上升期 2. 个人收获3.经验分享4. 展望未来 1. 前言 2025年1月16日,2024年博客之星入围公布,很荣幸获得了这次入围的机会。2024年对我个人是里程碑的一年,是意义非凡的一年,是充…

【RAG落地利器】向量数据库Chroma入门教程

安装部署 官方有pip安装的方式,为了落地使用,我们还是采用Docker部署的方式,参考链接来自官方部署: https://cookbook.chromadb.dev/running/running-chroma/#docker-compose-cloned-repo 我们在命令终端运行: docker run -d --…

电阻电位器可调电阻信号隔离变送器典型应用

电阻电位器可调电阻信号隔离变送器典型应用 产品描述: 深圳鑫永硕科技的XYS-5587系列是一进一出线性电子尺(电阻/电位计信号及位移)信号隔离变送器,是将输入电阻,线性电子尺,角度位移传感器信号进行采集,隔离,放大并转换成模拟量信号的小型仪表设备,并以…

[创业之路-259]:《向流程设计要效率》-1-让成功成熟业务交给流程进行复制, 把创新产品新业务新客户交给精英和牛人进行探索与创造

标题:成功与创新的双轨并行:以流程复制成熟,以精英驱动新知 在当今这个日新月异的商业环境中,企业要想持续繁荣发展,就必须在稳定与创新之间找到完美的平衡点。一方面,成熟业务的稳定运营是企业生存和发展的…

模拟飞行入坑(五) P3D 多通道视角配置 viewgroup

背景: P3D进行多个屏幕显示的时候,如果使用英伟达自带的屏幕融合成一个屏,或者使用P3D单独拉伸窗口,会使得P3D的画面被整体拉伸,又或者,当使用Multichannel进行多个设备联动时,视角同步组合需要配置&#…

Java中的错误与异常详解

Java中的错误与异常详解 Java提供了一种机制来捕获和处理程序中的异常和错误。异常和错误都继承自 Throwable 类,但它们有着不同的用途和处理方式。 1. Error(错误) Error 是程序无法处理的严重问题,通常由 JVM(Java…

免费开源的三维建模软件Blender

软件介绍 Blender是一款功能强大且免费开源的三维建模、动画制作和渲染软件,广泛应用于影视制作、游戏开发、建筑可视化、教育及艺术创作等多个领域。 核心功能 Blender是一款全能型3D软件,涵盖了从建模、动画到渲染、后期合成的完整工作流程。 1、建…

ElasticSearch DSL查询之排序和分页

一、排序功能 1. 默认排序 在 Elasticsearch 中,默认情况下,查询结果是根据 相关度 评分(score)进行排序的。我们之前已经了解过,相关度评分是通过 Elasticsearch 根据查询条件与文档内容的匹配程度自动计算得出的。…

iOS 网络请求: Alamofire 结合 ObjectMapper 实现自动解析

引言 在 iOS 开发中,网络请求是常见且致其重要的功能之一。从获取资料到上传数据,出色的网络请求框架能夠大大提升开发效率。 Alamofire 是一个极具人气的 Swift 网络请求框架,提供了便据的 API 以完成网络请求和响应处理。它支持多种请求类…

面向对象编程——对象实例化

在python中,对象实例化是根据类的定义创建具体对象的过程。也就是将类当成模板,从而定义了对象的结构和行为,而实例化则是根据这个模板创建具体的对象实例。每个实例都有自己独立的状态,但是却共享类的结构和方法。 代码&#xff…