当前位置: 首页 > news >正文

【JAVA】Java基础—面向对象编程:继承—重写父类方法

在Java开发中,重写(Override)是面向对象编程(OOP)中的一个重要概念。它允许子类提供父类方法的具体实现,从而改变或扩展父类的行为。重写是实现多态性的重要手段,使得程序在运行时能够根据对象的实际类型来调用相应的方法。

在实际应用中,重写父类方法的场景非常广泛。例如,假设我们正在开发一个图形处理软件,其中有多种形状(如圆形、矩形、三角形等)。我们可以定义一个父类Shape,然后为每种形状创建子类。在这些子类中,我们可以重写Shape类中的draw方法,以实现不同形状的绘制逻辑。

1. 什么是重写?

重写是指在子类中重新定义父类的方法。重写的方法必须与父类的方法具有相同的方法名、参数列表和返回类型。重写的目的是为了提供子类特有的实现。

2. 重写的规则

  • 方法名相同:子类方法的名称必须与父类方法相同。

  • 参数列表相同:子类方法的参数列表必须与父类方法的参数列表相同。

  • 返回类型相同:子类方法的返回类型必须与父类方法的返回类型相同,或者是其子类(协变返回类型)。

  • 访问修饰符:子类方法的访问修饰符不能比父类方法的修饰符更严格。例如,如果父类方法是public,那么子类方法不能是protectedprivate

  • 抛出异常:子类方法可以抛出父类方法抛出的异常,也可以抛出更具体的异常,但不能抛出更广泛的异常。

示例代码

下面我们通过一个简单的示例来演示如何重写父类方法。

示例 1:基本的重写
// 定义一个父类 Shape
class Shape {// 父类方法public void draw() {System.out.println("Drawing a shape");}
}// 定义一个子类 Circle 继承自 Shape
class Circle extends Shape {// 重写父类的 draw 方法@Overridepublic void draw() {System.out.println("Drawing a circle");}
}// 定义一个子类 Rectangle 继承自 Shape
class Rectangle extends Shape {// 重写父类的 draw 方法@Overridepublic void draw() {System.out.println("Drawing a rectangle");}
}// 主类
public class Main {public static void main(String[] args) {// 创建 Shape 类型的引用指向 Circle 对象Shape shape1 = new Circle();shape1.draw(); // 输出: Drawing a circle// 创建 Shape 类型的引用指向 Rectangle 对象Shape shape2 = new Rectangle();shape2.draw(); // 输出: Drawing a rectangle}
}
代码解释
  1. **父类 Shape**:定义了一个draw方法,表示绘制形状。

  2. 子类 Circle 和 **Rectangle**:分别重写了draw方法,提供了各自的实现。

  3. **主类 Main**:创建了Shape类型的引用,但指向不同的子类对象。通过这种方式,我们实现了多态性。

示例 2:重写与多态

在实际开发中,重写通常与多态结合使用。我们可以使用父类类型的引用来调用子类的方法,具体调用哪个方法在运行时决定。

// 父类
class Animal {public void sound() {System.out.println("Animal makes a sound");}
}// 子类 Dog
class Dog extends Animal {@Overridepublic void sound() {System.out.println("Dog barks");}
}// 子类 Cat
class Cat extends Animal {@Overridepublic void sound() {System.out.println("Cat meows");}
}// 主类
public class Main {public static void main(String[] args) {Animal myDog = new Dog();Animal myCat = new Cat();myDog.sound(); // 输出: Dog barksmyCat.sound(); // 输出: Cat meows}
}
代码解释
  1. **父类 Animal**:定义了一个sound方法,表示动物发出的声音。

  2. 子类 Dog 和 **Cat**:分别重写了sound方法,提供了不同的实现。

  3. **主类 Main**:通过Animal类型的引用调用DogCatsound方法,展示了多态性。

示例 3:重写中的访问修饰符

重写方法时,访问修饰符的选择也很重要。以下示例展示了如何在重写时使用不同的访问修饰符。

// 父类
class Vehicle {// 父类方法,使用 public 修饰符public void start() {System.out.println("Vehicle is starting");}
}// 子类 Car
class Car extends Vehicle {// 重写父类方法,仍然使用 public 修饰符@Overridepublic void start() {System.out.println("Car is starting");}
}// 子类 Bike
class Bike extends Vehicle {// 重写父类方法,使用 protected 修饰符(错误示例)// @Override// protected void start() { // 这将导致编译错误//     System.out.println("Bike is starting");// }
}// 主类
public class Main {public static void main(String[] args) {Vehicle myCar = new Car();myCar.start(); // 输出: Car is starting}
}
代码解释
  1. **父类 Vehicle**:定义了一个start方法,使用public修饰符。

  2. **子类 Car**:重写了start方法,仍然使用public修饰符。

  3. **子类 Bike**:尝试使用protected修饰符重写start方法,这会导致编译错误,因为protectedpublic更严格。

生活中的比喻

重写可以用生活中的许多场景来比喻。例如,想象一个父亲和他的孩子。父亲有一个技能,比如“游泳”。孩子可以继承这个技能,但他可以选择在游泳的方式上做出改变,比如“花样游泳”或“潜水”。在这个比喻中,父亲的游泳方式相当于父类的方法,而孩子的游泳方式则是重写的方法。

相关文章:

【JAVA】Java基础—面向对象编程:继承—重写父类方法

在Java开发中,重写(Override)是面向对象编程(OOP)中的一个重要概念。它允许子类提供父类方法的具体实现,从而改变或扩展父类的行为。重写是实现多态性的重要手段,使得程序在运行时能够根据对象的…...

【C++初阶】C++入门

1、C第一个程序 C是脱胎于C语言的&#xff0c;所以也包含了C语言绝大多数的内容&#xff0c;C兼容C语言绝大多数的语法,在C语言中能实现的程序在C中也是可以执行的&#xff0c;但需要将定义文件代码的后缀改为.cpp 就比如hello world程序 // test.cpp #include<stdio.h&g…...

自然推理系统:的拒取式的解析

要推导出 **"非A"** 的拒取式 (rejection form)&#xff0c;首先我们要理解逻辑推理中几个基本的概念。 假设我们有以下前提&#xff1a; 1. **A → B** &#xff08;如果A成立&#xff0c;那么B成立&#xff09; 2. **非B** &#xff08;B不成立&#xff09; 我们…...

OceanBase 分区表详解

1、分区表的定义 在OceanBase数据库中&#xff0c;普通的表数据可以根据预设的规则被分割并存储到不同的数据区块中&#xff0c;同一区块的数据是在一个物理存储上。这样被分区块的表被称为分区表&#xff0c;而其中的每一个独立的数据区块则被称为一个分区。 如下图所示&…...

Java中 LinkedList<>,ArrayDeque<>的区别 || Queue和Deque的区别

我是你爹 LinkedList<> 和 ArrayDeque<> 的区别Queue接口 和 Deque接口区别Queue 的用法Deque 的用法 LinkedList<> 和 ArrayDeque<> 的区别 1. 数据结构实现方式&#xff1a; LinkedList&#xff1a; 基于链表结构&#xff0c;是一个双向链表。每个…...

freemarker 读取template.xml ,通过response 输出文件,解决中文乱码问题

采用 try (Writer writer new OutputStreamWriter(os, “UTF-8”)) UTF-8 内容转换 public static void setResponseHeader(HttpServletResponse response, String fileName) {try {// fileName "中文.xls";try {fileName new String(fileName.getBytes(),"…...

arkUI:水果选择与管理:基于 ArkUI 的长按编辑功能实现

水果选择与管理&#xff1a;基于 ArkUI 的长按编辑功能实现 1 主要内容说明2 相关内容2.1 相关内容2.1.1 源码1内容的相关说明2.1.1.1 数据结构与状态管理2.1.1.2 添加水果功能2.1.1.3 水果列表展示2.1.1.4 长按进入编辑模式2.1.1.5 复选框的多选功能2.1.1.6 删除水果功能2.1.1…...

docker使用,docker图形化界面+docker详细命令

DockerUI进入 docker container run --rm --name docker.ui -v /var/run/docker.sock:/var/run/docker.sock -p 8999:8999 joinsunsoft/docker.ui访问8999端口就行&#xff0c;就可以图形化管理Docker了 常规使用 搭建 sudo docker-compose build #有一些需要这条命令 su…...

idea项目运行时 java: 错误: 不支持发行版本 21

java项目运行时&#xff0c;同样的项目别的都是正常运行&#xff0c;单个这个项目一直报 java: 错误: 不支持发行版本 21&#xff0c; 报错的解释 这个错误表明你正在尝试使用Java编译器编译一个类&#xff0c;但是编译器遇到了一个它不支持的版本号&#xff0c;在这个上下文…...

hive alter table add columns 是否使用 cascade 的方案

结论 alter table xxx add columns 时加上 cascade 时&#xff0c;会把所有的分区都加上此字段。如果不加则只有新的分区会加上此字段&#xff0c;旧的分区没有此字段&#xff0c;即便数据文件里有对应的数据&#xff0c;也不能显示内容。 如果分区都是 insert overwrite 生成…...

手机怎么玩steam游戏?随时随地远程串流玩steam游戏教程

喜欢在steam上玩游戏的玩家有没有想过&#xff0c;其实这些游戏也能在手机上玩呢&#xff1f;不管是探索的开放世界游戏&#xff0c;还是紧张刺激的射击游戏&#xff0c;还是丰富剧情的视觉小说等等&#xff0c;这些游戏你都可以通过远程串流软件&#xff0c;来帮你实现在手机上…...

【使用antv g6实现拓扑图】

使用antv g6实现拓扑图 安装antv g6创建一个 div&#xff0c;并制定必须的属性 id定义初始化方法定义node节点数据将获取到的数据渲染进页面 安装antv g6 npm install antv/g6 --save import G6 from antv/g6;创建一个 div&#xff0c;并制定必须的属性 id 定义好展示id&…...

【数学 函数空间】拉普拉斯变换解微分方程步骤

拉普拉斯变换解微分方程 拉普拉斯变换解微分方程的一般步骤如下&#xff1a; 写出微分方程。对微分方程两边应用拉普拉斯正变换。求解变换后的代数方程&#xff0c;得到 Y ( s ) Y(s) Y(s)。如果需要&#xff0c;进行部分分式分解。对 Y ( s ) Y(s) Y(s)进行拉普拉斯逆变换&…...

vue3: toRef, reactive, toRefs, toRaw

vue3&#xff1a; toRef, reactive, toRefs, toRaw <template><div>{{ man }}</div><hr><!-- <div>{{ name }}--{{ age }}--{{ like }}</div> --><div><button click"change">修改</button></div&g…...

Unity读取Json

参考 Unity读取Json的几种方法_unity读取json文件-CSDN博客...

基于STM32的智能语音识别饮水机系统设计

功能描述 1、给饮水机设定称呼&#xff0c;喊出称呼&#xff0c;饮水机回答&#xff1a;我在 2、语音进行加热功能&#xff0c;说&#xff1a;请加热&#xff0c;加热片运行 3、饮水机水位检测&#xff0c;低于阈值播报“水量少&#xff0c;请换水” 4、检测饮水机水温&#xf…...

c++的几种构造函数

c的几种构造函数 构造函数拷贝构造函数转换构造函数移动构造函数 析构函数 构造函数 C中的构造函数可以分为5类&#xff1a;默认构造函数、普通构造函数、拷贝构造函数、转换构造函数、移动构造函数。 好像还有委托构造 默认构造和普通构造和java基本一样 详细 拷贝构造函…...

FRP 实现内网穿透

如何通过 FRP 实现内网穿透&#xff1a;群晖 NAS 的 Gitea 和 GitLab 访问配置指南 在自建服务的过程中&#xff0c;经常会遇到内网访问受限的问题。本文将介绍如何利用 FRP&#xff08;Fast Reverse Proxy&#xff09;来实现内网穿透&#xff0c;以便在外网访问群晖 NAS 上的…...

数据结构笔记(其八)--一般树的存储及其遍历

1.知识总览 一般的树会有多个孩子&#xff0c;所以存储结构也会与二叉树略有不同。 一般树的遍历。 2.双亲表示法 双亲表示法&#xff0c;也是父亲表示法&#xff0c;即每个节点中都存储了其父节点的地址信息。 特性&#xff1a;可以轻易地找到父节点&#xff0c;但寻找孩子节…...

在spring boot工程中使用Filter时,@WebFilter 注解不生效的问题分析和解决方案

1. 问题描述 首先编写一个Filter类并通过Component放入spring容器中&#xff0c;通过实现jakarta.servlet中提供的Filter接口完成过滤器的创建&#xff0c;代码如下。 import jakarta.servlet.*; import jakarta.servlet.annotation.WebFilter; import org.springframework.st…...

[vxe-table] 动态列渲染中v-if与key的协同优化方案

1. 动态列渲染的常见问题与根源分析 在使用vxe-table进行动态列渲染时&#xff0c;很多开发者都遇到过这样的场景&#xff1a;当表格列通过v-if条件动态显示或隐藏时&#xff0c;列的位置和样式会出现莫名其妙的错乱。比如原本应该在第三列显示的数据突然跳到了第五列&#xff…...

Aria2磁力链接下载进阶技巧:多文件选择与限速设置详解

Aria2磁力链接下载进阶技巧&#xff1a;多文件选择与限速设置详解 在数字资源获取日益便捷的今天&#xff0c;高效下载工具成为技术爱好者和专业人士的必备利器。Aria2作为一款轻量级、多协议支持的命令行下载工具&#xff0c;凭借其强大的功能和灵活的配置选项&#xff0c;在L…...

DFT工程师的隐藏技巧:深入解读TestMAX中Shared与Dedicated Wrapper Cell的选择策略

DFT工程师的隐藏技巧&#xff1a;深入解读TestMAX中Shared与Dedicated Wrapper Cell的选择策略 在芯片设计的可测试性设计&#xff08;DFT&#xff09;领域&#xff0c;Wrapper Cell的选择往往被视为一项"黑盒"操作——工程师们习惯依赖EDA工具自动完成&#xff0c;却…...

DSQC346G 3HAB8101-8 机器人伺服驱动单元

DSQC346G 3HAB8101‑8 机器人伺服驱动单元介绍DSQC346G&#xff08;3HAB8101‑8&#xff09;是一款专用于工业机器人伺服系统的驱动单元&#xff0c;用于控制伺服电机的运动与输出&#xff0c;实现机器人关节或轴的精确位置、速度和力矩控制&#xff0c;是机器人驱动链中的核心…...

突破Windows限制:告别模拟器烦恼的安卓应用高效工具

突破Windows限制&#xff1a;告别模拟器烦恼的安卓应用高效工具 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在数字化办公与娱乐融合的今天&#xff0c;Windows用户…...

如何一站式解决漫画格式转换难题:CBconvert完整指南

如何一站式解决漫画格式转换难题&#xff1a;CBconvert完整指南 【免费下载链接】cbconvert CBconvert is a Comic Book converter 项目地址: https://gitcode.com/gh_mirrors/cb/cbconvert 还在为不同设备上的漫画格式兼容性问题而烦恼吗&#xff1f;CBconvert作为一款…...

kin-openapi版本迁移指南:从v0.x到v1.0的平滑升级

kin-openapi版本迁移指南&#xff1a;从v0.x到v1.0的平滑升级 【免费下载链接】kin-openapi OpenAPI 3.0 (and Swagger v2) implementation for Go (parsing, converting, validation, and more) 项目地址: https://gitcode.com/gh_mirrors/ki/kin-openapi kin-openapi是…...

终极指南:用30亿参数Qwen2.5-VL-3B解锁企业级视觉语言能力

终极指南&#xff1a;用30亿参数Qwen2.5-VL-3B解锁企业级视觉语言能力 【免费下载链接】Qwen2.5-VL-3B-Instruct 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen2.5-VL-3B-Instruct 你是否曾被大型视觉语言模型的高昂部署成本所困扰&#xff1f;是否因为硬件限…...

成电计算机复试面试:如何用一份‘心机’简历引导老师提问,并提前准备好答案?

计算机复试策略&#xff1a;如何用结构化简历设计引导面试走向 站在电子科技大学计算机复试的考场外&#xff0c;大多数考生都在反复背诵技术概念和项目细节&#xff0c;却很少有人意识到——面试本质上是一场精心设计的对话博弈。那些最终获得高分的考生&#xff0c;往往不是知…...

5大核心能力解析:YimMenu如何重塑GTA5游戏体验与安全防护

5大核心能力解析&#xff1a;YimMenu如何重塑GTA5游戏体验与安全防护 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/Y…...