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…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...