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

一、背景介绍

在Java编程中,方法重写是面向对象编程(OOP)的一项重要特性。它允许子类提供对父类方法的具体实现,以便实现多态性。方法重写的主要用途包括:

  1. 实现多态性:允许在运行时根据对象的实际类型调用相应的方法。

  2. 增强代码的灵活性:子类可以根据自己的需求修改或扩展父类的方法,而不必修改父类的代码。

  3. 提高代码的可维护性:通过重写方法,可以集中处理子类特有的行为,使得代码更加清晰。

重要性
  1. 代码复用:通过继承和重写,子类可以复用父类的代码,减少重复。

  2. 动态绑定:方法重写使得Java能够在运行时决定调用哪个方法,这为多态性提供了基础。

  3. 增强功能:子类可以在不改变父类的情况下,增强或修改方法的行为。

生活中的类比

可以将方法重写比作一个公司中的员工(子类)和他们的上司(父类)。上司制定了一个工作流程(父类方法),而员工可以根据自己的工作需要调整这个流程(重写方法)。比如,销售部门的员工可能会在客户服务中添加一些额外的步骤,而技术支持部门的员工则可能会有不同的处理流程。通过这种方式,员工可以在遵循上司的指导的同时,灵活应对不同的工作需求。

二、方法重写的基本概念

1. 基本语法

在Java中,方法重写的基本语法是:在子类中定义一个与父类方法相同的方法名、返回类型和参数列表。重写的方法必须与父类的方法具有相同的签名(即方法名和参数列表)。

基本语法示例

class Parent {void display() {System.out.println("Display from Parent");}
}class Child extends Parent {@Overridevoid display() {System.out.println("Display from Child");}
}

三、方法重写的应用示例

示例 1:基本的重写示例

示例代码

// 父类
class Animal {void sound() {System.out.println("Animal makes a sound");}
}// 子类
class Dog extends Animal {@Overridevoid sound() {System.out.println("Dog barks");}
}// 主类
public class Main {public static void main(String[] args) {Animal myDog = new Dog(); // 向上转型myDog.sound(); // 调用重写的方法}
}

代码解释

  1. **父类 Animal**:

    • 定义了一个方法sound(),输出“Animal makes a sound”。

  2. **子类 Dog**:

    • 使用extends关键字继承Animal类。

    • 重写了sound()方法,输出“Dog barks”。这里使用了@Override注解,表示这是一个重写的方法。

  3. **主类 Main**:

    • 创建了一个Dog类的对象myDog,并将其引用赋值给Animal类型的变量(向上转型)。

    • 调用myDog.sound()时,实际上调用的是Dog类中重写的方法,输出“Dog barks”。

示例 2:重写带参数的方法

示例代码

// 父类
class Calculator {// 方法重载:计算两个整数的和int add(int a, int b) {return a + b;}
}// 子类
class ScientificCalculator extends Calculator {// 重写父类的方法,增加一个浮点数参数@Overrideint add(int a, int b) {return a + b; // 调用父类的add方法}// 新增一个方法,计算三个整数的和int add(int a, int b, int c) {return a + b + c;}
}// 主类
public class Main {public static void main(String[] args) {ScientificCalculator calc = new ScientificCalculator();System.out.println("Sum of 2 and 3: " + calc.add(2, 3)); // 调用重写的方法System.out.println("Sum of 2, 3, and 4: " + calc.add(2, 3, 4)); // 调用新方法}
}

代码解释

  1. **父类 Calculator**:

    • 定义了一个方法add(int a, int b),计算两个整数的和。

  2. **子类 ScientificCalculator**:

    • 使用extends关键字继承Calculator类。

    • 重写了add(int a, int b)方法,虽然实现与父类相同,但可以根据需要进行不同的实现。

    • 新增了一个方法add(int a, int b, int c),计算三个整数的和。

  3. **主类 Main**:

    • 创建ScientificCalculator类的对象calc,调用重写的方法和新方法,展示了不同的加法实现。

示例 3:重写与多态性结合

示例代码

// 父类
class Shape {void draw() {System.out.println("Drawing a shape");}
}// 子类
class Circle extends Shape {@Overridevoid draw() {System.out.println("Drawing a circle");}
}// 子类
class Square extends Shape {@Overridevoid draw() {System.out.println("Drawing a square");}
}// 主类
public class Main {public static void main(String[] args) {Shape shape1 = new Circle(); // 向上转型Shape shape2 = new Square(); // 向上转型shape1.draw(); // 调用Circle的draw方法shape2.draw(); // 调用Square的draw方法}
}

代码解释

  1. **父类 Shape**:

    • 定义了一个方法draw(),输出“Drawing a shape”。

  2. **子类 Circle**:

    • 重写了draw()方法,输出“Drawing a circle”。

  3. **子类 Square**:

    • 重写了draw()方法,输出“Drawing a square”。

  4. **主类 Main**:

    • 创建CircleSquare类的对象,并将其引用赋值给Shape类型的变量(向上转型)。

    • 调用shape1.draw()shape2.draw()时,分别调用了CircleSquare类中的重写方法,展示了多态性的特性。

四、方法重写的注意事项

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

  2. 访问修饰符:重写的方法的访问修饰符必须与父类的方法相同或更宽松(例如,父类方法是protected,子类可以是protectedpublic)。

  3. 不能重写静态方法:静态方法属于类而不是实例,因此不能被重写,只能被隐藏。

  4. 不能重写final方法:如果父类的方法被声明为final,则不能在子类中重写。

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

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

相关文章

React Native 全栈开发实战班 -React Native 基础

本课程旨在帮助学员系统掌握 React Native 全栈开发技能,从基础入门到实战项目开发。课程将分为多个模块,第一部分将聚焦于 React Native 的基础知识,包括开发环境搭建、React Native 简介与特点,以及项目结构解析。 第一部分&am…

Leetcode:118. 杨辉三角——Java数学法求解

题目——Leetcode:118. 杨辉三角 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRow…

Linux中.NET读取excel组件,不会出现The type initializer for ‘Gdip‘ threw an exception异常

组件,可通过nuget安装,直接搜名字: ExcelDataReader using ConsoleAppReadFileData.Model; using ExcelDataReader; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Task…

Robot | 用 RDK 做一个小型机器人(更新中)

目录 前言架构图开发过程摄像头模型转换准备校准数据使用 hb_mapper makertbin 工具转换模型 底版开发 结语 前言 最近想开发一个小型机器人,碰巧看到了 RDK x5 发布了,参数对于我来说非常合适,就买了一块回来玩。 外设也是非常丰富&#xf…

jenkins使用cli发行uni-app到h5

官网文档HBuilderX 文档 首先确定是否存在环境变量 正常情况cmd中执行cli 如果提示 cli 不是内部或外部命令,也不是可运行的程序或批处理文件。请先配置环境变量 Freestyle Project项目在Build Steps中增加Execute Windows batch command命令如下 d: cd D:\devsof…

基于Zynq FPGA对雷龙SD NAND的测试

一、SD NAND特征 1.1 SD卡简介 雷龙的SD NAND有很多型号,在测试中使用的是CSNP4GCR01-AMW与CSNP32GCR01-AOW。芯片是基于NAND FLASH和 SD控制器实现的SD卡。具有强大的坏块管理和纠错功能,并且在意外掉电的情况下同样能保证数据的安全。 其特点如下&…

【Java语言】String类

在C语言中字符串用字符可以表示,可在Java中有单独的类来表示字符串(就是String),现在我来介绍介绍String类。 字符串构造 一般字符串都是直接赋值构造的,像这样: 还可以这样构造: 图更能直观的…

【神经科学学习笔记】基于分层嵌套谱分割(Nested Spectral Partition)模型分析大脑网络整合与分离的局部指标(二)

前言 1.学习背景 前几天笔者学习使用NSP (Network Segregation and Partnership) 算法计算大脑整合分离的全局指标,现在要在之前学习的基础上再来玩玩局部指标。 局部指标的计算主要在两个层面上进行:第一个层面是针对每个独立ROI的指标计算&#xff0…

WPF-控件的属性值的类型转化

控件的属性值需要转成int、double进行运算的&#xff0c;可以使用一下方法 页面代码 <StackPanel Margin"4,0,0,0" Style"{StaticResource Form-StackPanel}"> <Label Content"替换后材料增加金额&#xff…

Python3.11.9下载和安装

一、Python3.11.9下载和安装 1、下载 下载地址&#xff1a;https://www.python.org/downloads/windows/ 选择版本下载&#xff0c;例如&#xff1a;Python 3.11.9 - April 2, 2024 2、安装 双击exe安装 3、配置环境变量 pathD:\Program Files\python3.11.9 pathD:\Progr…

大模型学习笔记------BLIP模型的再思考

大模型学习笔记------BLIP模型的再思考 1、BLIP推理---如何进行“图生文”2、BLIP推理---如何进行视觉问答&#xff08;Visual Question Answering, VQA&#xff09;3、BLIP推理---如何进行图文检索&#xff08;Image-text retrieval&#xff09;任务4、总结 上一篇文章上文中讲…

超全面!一文带你快速入门HTML,CSS和JavaScript!

作为一名后端程序员&#xff0c;在开发过程中避免不了和前端打交道&#xff0c;所以就要了解一些前端的基础知识&#xff0c;比如三剑客HTML,CSS,JavaScript&#xff0c;甚至有必要学习一下Vue、React等前端主流框架。 学习文档&#xff1a;https://www.w3school.com.cn/ 一…

PcVue + SQL Grid : 释放数据的无限潜力

探秘PcVue系列&#xff1a;E3 PcVue SQL Grid : 释放数据的无限潜力 探秘PcVue之SQL 什么是SQL Grid&#xff1f; SQL Grid用于通过简单的sql查询语句&#xff0c;实现数据的查询和显示。结构化查询语句&#xff08;SQL&#xff09;可以帮助SCADA软件用户提高连接性以及发送和…

使用 Umami 部署博客分析工具

Umami 简介 Umami 是一款开源且注重隐私的网站分析工具&#xff0c;可替代 Google Analytics。它提供网站流量和用户行为等见解&#xff0c;但不使用 Cookie 或收集个人数据&#xff0c;符合隐私法规。Umami 轻巧易用&#xff0c;可自行托管。 如果你有自己的博客&#xff0c;…

Flink_DataStreamAPI_执行环境

DataStreamAPI_执行环境 1创建执行环境1.1getExecutionEnvironment1.2createLocalEnvironment1.3createRemoteEnvironment 2执行模式&#xff08;Execution Mode&#xff09;3触发程序执行 Flink程序可以在各种上下文环境中运行&#xff1a;我们可以在本地JVM中执行程序&#x…

数据结构——排序(续集)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

MongoDB在现代Web开发中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 MongoDB在现代Web开发中的应用 MongoDB在现代Web开发中的应用 MongoDB在现代Web开发中的应用 引言 MongoDB 概述 定义与原理 发展…

CSS的综合应用例子(网页制作)

这是html的一些最基本内容的代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <t…

【设计模式】行为型模式(二):策略模式、命令模式

行为型模式&#xff08;二&#xff09;&#xff1a;策略模式、命令模式 3.策略模式&#xff08;Strategy&#xff09;3.1 示例3.1.1 定义策略接口3.1.2 实现具体策略3.1.3 定义上下文类3.1.4 客户端代码3.1.5 输出结果 3.2 总结3.2.1 优点3.2.2 缺点 4.命令模式&#xff08;Com…

rocketmq——docker-compose安装

rocketmq安装 创建文件夹&#xff0c;这里我们分别部署namesrv和broker 1、namesrv.conf listenPort98762、broker.conf # 所属集群名字 brokerClusterNameDefaultCluster # broker 名字&#xff0c;注意此处不同的配置文件填写的不一样&#xff0c;如果在 broker-a.propert…