6. 继承、重写、super、final
文章目录
- 一、重新定义需求
- 二、继承
- 1. 继续分析
- 2. 概念
- 3. 代码
- ① 父类
- ② 子类
- ③ 测试结果
- 4. 饿狼传说之多层继承
- ① 概念
- ② 代码
- 5. 多继承
- 三、方法的重写
- 1. 情境
- 2. 代码
- ① 吃什么
- ② 怎么叫(Override重写)
- 3. 小结
- 四、super
- 1. 啃老
- 2. 啃老啃到底
- 五、final
- 1. 用途及特征
- 2. 举例理解
- ① 修饰类
- ② 修饰方法
- ③ 修饰成员变量
- 补充
- 3. 更通俗地理解
- 六、内容出处
一、重新定义需求
你的程序火了以后,又有大爷大妈来找你了。他们说,不能光给养狗的写啊,也得考虑一下他们这些养猫的、养仓鼠的人啊。
这个问题该怎么解决呢?总不能给每种宠物都写一个程序吧,那得把人累死。或者说在当前程序里再定义一些cat类、Hamster类等,定义完怎么办呢,又得重新定义姓名、年龄、品种、食物、吃喝拉撒这些属性,这是不是太麻烦了。
二、继承
1. 继续分析
我们可以再想一下,猫、狗、仓鼠是不是都是动物啊。而且它们都有姓名、年龄、品种、吃喝拉撒这些属性,这些属性也恰好是所有动物的共性。
既然如此,我们是不是可以把这些共性抽离出来给Animal这个类,再让Cats、Dogs、Hamsters去继承Animal里面的东西。这样一来,就不需要重复定义了。相当于又从一个更高的维度去看待问题了。
2. 概念
继承描述是父和子的关系。共性的部分抽离出来,放在父类(如:Animal类)里,子类(如:Cats类)保存特性(如:猫需要猫砂)。
通俗一点就是上梁不正下梁歪(虽然是贬义词,但是凑合着理解吧)、这孩子跟ta爸一模一样。
写法:子类 extends 父类
3. 代码

① 父类
直接从原来的Dogs类里剪切🤣
package com.practice.bean;import lombok.Getter;
import lombok.Setter;
import lombok.ToString;@Getter
@Setter
@ToString
public class Animal {private String name;private int age;private String variety;private String food;private static String plot = "NanG";public static String getPlot(){return plot;}// 无参构造器public Animal(){}// 有参构造器public Animal(String name, int age, String variety, String food) {this.name = name;this.age = age;this.variety = variety;this.food = food;}public Animal(String name, String variety){this.name = name;this.variety = variety;}public Animal(String name){this.name = name;}public void setAge(int age){if(age < 0 || age > 30){System.out.println("输入数据不合法, 已为您自动清零");this.age = 0;}else{this.age = age;}}public int getAge(){return this.age;}public void eat() {System.out.println(this.name + "吃饭!");this.sleep();}public void sleep() {System.out.println(this.name + "睡觉!");}void crazy() {System.out.println(this.name + "发疯");}// //不合理
// private String plot = "NanG";
// public String getPlot(){
// return this.plot;
// }public static void injection(){System.out.println("所有的动物, 月底打针!");}
}
② 子类
③ 测试结果
由此可见,狗、猫和仓鼠类确实继承了Animal类里的东西。虽然也可以直接创建一个Animal的实例,但是说实话意义不大。
4. 饿狼传说之多层继承
① 概念
通俗来说就是,灰太狼从他太太太爷爷那一辈就吃不到羊,他继承了这个基因,所以他也没吃到羊。
② 代码
Animal和Dogs类没做任何改动
5. 多继承
多继承:联想一下骡子(马和驴的杂交种,同时具备马和驴的共性)。
java不支持多继承
三、方法的重写
1. 情境
如图所示,上述程序可以王阿姨家的狗和张大爷家的猫在吃饭和在喊叫。但是我现在想知道它们吃的是什么?怎么叫的?
2. 代码
① 吃什么
显然,王阿姨和张大爷可以自己决定家里的宠物吃什么。因此可以借助food这个成员变量,通过传参数区分宠物的食物。
② 怎么叫(Override重写)
王阿姨和张大爷肯定不能决定自己家的宠物怎么叫啊,所以刚刚传参的方式肯定不适用。这个时候就要用到重写了。
3. 小结
① 在子类当中,凡是@Override注解下面的方法一定是来自于它父类的,但是它又不学它的父亲。比如说灰太狼有天确实吃到羊了,不走他父亲的老路了。
② 子类自己认为,必须打破他父亲的传统,进行革新,革新的内容就是方法体,于是它重新写了父类的方法。例如王阿姨家的狗可以汪汪叫了,张大爷家的猫可以喵喵叫了,发展了自己的特性,没必要都动物叫了。
③ 快捷键:alt + insert -> Override Methods
四、super
1. 啃老
那我子类重写了父类的方法,但是我要是还想使用父类的方法该怎么办呢?通俗来说就是,我不想自己赚钱自己花了,我想直接花我爹的。放到该案例中就是,王阿姨家的狗说我不想汪汪叫了,我就乐意动物叫。
alt + insert -> Override Methods 可快速生成重写方法。
这样一来,王阿姨家的狗就不是汪汪叫了,开始动物叫了。
2. 啃老啃到底
继承本身是不能继承父类的构造方法的。通俗来讲就是,啃老不能说连爸爸的脸也一起照搬弄到自己脸上,这是很难的。那我如果我非要这么做怎么办呢?还得靠super
例如:我现在可以初始化一个动物实例(因为Animal类里有相关的构造方法),但是没有办法初始化一个狗的实例(Dogs类里没有相关的构造方法)。
现在要开始啃老了。
快捷键:alt + insert -> Constructor(Override Methods也可以) -> 全选(找到构造方法, 然后选择) -> 回车
发现可以了
五、final
1. 用途及特征
① 用途:修饰类;修饰方法;修饰成员变量
② 特征:final意为最终,也就是说断子绝孙了。final修饰的类已经是最底层了,后面没人继承它了,它也不能被继承;final修饰的方法不可以被子类重写,但是可以仍旧被子类使用;final修饰的成员变量的值后续不可以被更改了。
2. 举例理解
① 修饰类
显然,拉布拉多已经是我们这个程序的最底层了。没有动物会再继承它了,此时我们就可以用final修饰它。
随意新建一个类去验证一下,发现拉布拉多这个类确实不能被继承。
② 修饰方法
我们知道拉布拉多是一种导盲犬。因此我们可以在Dogs类里面写一个类似的方法,再在Labrador类里重写一下。
此时如果用final修饰Dogs类里的这个导盲方法,就会发现Labrador类无法重写这个方法了。
但是拉布拉多犬仍然可以使用这个方法,只不过返回的也是false了。
③ 修饰成员变量
用static修饰小区名以后,虽然外部不能更改了,但是仍然无法防止程序员自身手误导致该变量值被更改。
这样一来,拉布拉多发个疯就把小区名给改了,太荒谬了吧。怎么办呢?用final修饰这个成员变量
补充
① 根据阿里开发手册的要求,我们用plot表示小区名显然不太合理。可以改成text_community_name,text指的是该变量的实际用途(虽然这样写也不太合适,但凑合着看),而且要全部大写。
② idea全部大写快捷键:Ctrl + Shitf + u
3. 更通俗地理解
假设A是一个富豪,B是ta的孩子。正常情况下B是可以继承A所有东西的。
但是A觉得B太败家了,又不孝顺,因此不想给B一点遗产。这种情况下,就可以直接用final修饰A这整个类。
A转念一想,B毕竟是自己的孩子,万一ta以后想改过自新了呢,总要给孩子留点退路,不能逼太紧。于是,A就把车子、房子留给B了。但是思虑再三后决定,不能给B过多现金,ta可以定期拿一部分作为生活费,但是不能为所欲为。这种情况下,A就在自己这个类里写了一个getMoney()方法,并且用final修饰了。
A为了防止B把房子卖了,于是把地契都给烧了。这个时候,就可以用final修饰home这个成员变量。
六、内容出处
java
相关文章:
6. 继承、重写、super、final
文章目录 一、重新定义需求二、继承1. 继续分析2. 概念3. 代码① 父类② 子类③ 测试结果 4. 饿狼传说之多层继承① 概念② 代码 5. 多继承 三、方法的重写1. 情境2. 代码① 吃什么② 怎么叫(Override重写) 3. 小结 四、super1. 啃老2. 啃老啃到底 五、final1. 用途及特征2. 举…...
Redis 其他类型 渐进式遍历
我们之前已经学过了Redis最常用的五个类型了,然而Redis还有一些在特定场景下比较好用的类型 Redis最关键的五个数据类型: 上面的类型是非常常用,很重要的类型。 除此之外的其他类型不常用,只是在特定的场景能够发挥用处&#…...
科研绘图系列:R语言绘制SCI文章图2
文章目录 介绍加载R包导入数据图a图b图d系统信息介绍 文章提供了绘制图a,图b和图d的数据和代码 加载R包 library(ggplot2) library(dplyr) library(readxl) library(ggpmisc)导入数据 数据可从以下链接下载(画图所需要的所有数据): 百度网盘下载链接: https://pan.baid…...
ARM知识点三和串口代码的编写流程
ARM的一些常见问题 ARM 体系结构的主要特点是什么? 精简指令集 (RISC):ARM 采用 RISC 结构,指令集较小且简单,执行效率高。相比于复杂指令集 (CISC),RISC 更强调每条指令的执行速度。低功耗设计:ARM 处理…...
【unity踩坑】打开vs2022没有文字联想/杂项文件
unity打开vs2022没有文字联想 修改外置编辑器安装unity开发插件vs编辑器显示杂项文件 修改外置编辑器安装unity开发插件 参考 在unity项目里选择Edit-> Preferences->External Tools然后更换编辑器 在vs工具界面添加unity游戏开发选项。 重新打开还是有问题ÿ…...
WebGoat JAVA反序列化漏洞源码分析
目录 InsecureDeserializationTask.java 代码分析 反序列化漏洞知识补充 VulnerableTaskHolder类分析 poc 编写 WebGoat 靶场地址:GitHub - WebGoat/WebGoat: WebGoat is a deliberately insecure application 这里就不介绍怎么搭建了,可以参考其他…...
大数据-161 Apache Kylin 构建Cube 按照日期、区域、产品、渠道 与 Cube 优化
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...
uni-app使用v-show编译成微信小程序的问题
问题 在uni-app使用v-show语法编译成微信小程序会有一个问题 当我们设置成v-show"false" 在Hbuilder X里面确实没有显示 然后运行到 微信开发程序里面 发现显示了出来,说明设置的 v-show"false"没有起作用 解决办法 首先去uniapp官网查看v…...
充电宝租赁管理系统网站毕业设计SpringBootSSM框架开发
目录 1. 概述 2. 技术选择与介绍 3. 系统设计 4. 功能实现 5. 需求分析 1. 概述 充电宝租赁管理系统网站是一个既实用又具有挑战性的项目。 随着移动设备的普及和人们日常生活对电力的持续依赖,充电宝租赁服务已成为现代都市生活中的一项重要便利设施。它不仅为…...
喜讯!迈威通信TSN产品通过“时间敏感网络(TSN)产业链名录计划”评测,各项指标名列前茅
TSN技术,作为推动企业网络化与智能化转型的关键力量,已成为工业网络迈向下一代演进的共识方向,正加速重构工业网络的技术架构与产业生态。为响应这一趋势,工业互联网产业联盟携手中国信息通信研究院及50余家产学研用单位ÿ…...
国产工具链GCKontrol-GCAir助力控制律开发快速验证
前言 随着航空领域技术的不断发展,飞机的飞行品质评估和优化成为了航空领域的一个重要任务,为了确保飞行器在各种复杂条件下的稳定性,控制律设计过程中的模型和数据验证需要大量仿真和测试。 本文将探讨基于世冠科技的国产软件工具链GCKont…...
嵌入式开发:STM32 硬件 CRC 使用
测试平台:STM32G474系列 STM32硬件的CRC不占用MCU的资源,计算速度快。由于硬件CRC需要配置一些选项,配置不对就会导致计算结果错误,导致使用上没有软件计算CRC方便。但硬件CRC更快的速度在一些有时间资源要求的场合还是非…...
基于STM32的智能家居语音控制系统:集成LD3320、ESP8266设计流程
一、项目概述 项目目标和用途 近年来,智能家居产品逐渐成为家庭生活中不可或缺的一部分。为了提升家庭生活的便捷性和舒适度,本项目旨在设计一款基于STM32F407VGT6(Cortex-M4内核)微控制器的多功能智能家居语音控制系统。该系统…...
【docker】要将容器中的 livox_to_pointcloud2 文件夹复制到宿主机上
复制文件夹 使用 docker cp 命令从容器复制文件夹到宿主机: docker cp <container_id_or_name>:/ws_livox/src/livox_to_pointcloud2 /path/to/host/folder sudo docker cp dandong_orin_docker:/ws_livox/src/livox_to_pointcloud2 /home...
网络编程(17)——asio多线程模型IOThreadPool
十七、day17 之前我们介绍了IOServicePool的方式,一个IOServicePool开启n个线程和n个iocontext,每个线程内独立运行iocontext, 各个iocontext监听各自绑定的socket是否就绪,如果就绪就在各自线程里触发回调函数。为避免线程安全问题…...
【rust/egui/android】在android中使用egui库
文章目录 说在前面AndroidStudio安装编译安装运行问题 说在前面 操作系统:windows11java版本:23android sdk版本:35android ndk版本:22rust版本: AndroidStudio安装 安装AndroidStudio是为了安装sdk、ndk,…...
Git---Git打标签
打标签 像其他版本控制系统(VCS)一样,Git 可以给仓库历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点( v1.0 、 v2.0 等等)。 在本节中,你将会学习如…...
深入理解Transformer的笔记记录(精简版本)---- Transformer
自注意力机制开启大规模预训练时代 1 从机器翻译模型举例 1.1把编码器和解码器联合起来看待的话,则整个流程就是(如下图从左至右所示): 1.首先,从编码器输入的句子会先经过一个自注意力层(即self-attention),它会帮助编码器在对每个单词编码时关注输入句子中的的其他单…...
Ubuntu 更换内核版本
更换内核脚本 这里以更换 5.15.0-88-generic 版本内核为例 cat kernel.sh#!/bin/bashapt install linux-image-5.15.0-88-generic # Ubuntu内核切换脚本# 检查是否具有root权限 if [[ $(id -u) -ne 0 ]]; thenecho "请以root身份运行此脚本。"exit 1 fi# 检查系统是…...
博士找高校教职避坑指南:史上最全的避坑秘籍
在学术的海洋中遨游多年,博士们终于要踏上寻找高校教职的征程。这不仅是职业生涯的新起点,更是一场充满未知与挑战的冒险。今天,就让我们来聊聊那些在寻找高校教职时需要避开的坑,希望能为你的求职之路保驾护航。 1. 薪资结构&am…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...











































