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

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最常用的五个类型了&#xff0c;然而Redis还有一些在特定场景下比较好用的类型 Redis最关键的五个数据类型&#xff1a; 上面的类型是非常常用&#xff0c;很重要的类型。 除此之外的其他类型不常用&#xff0c;只是在特定的场景能够发挥用处&#…...

科研绘图系列: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 体系结构的主要特点是什么&#xff1f; 精简指令集 (RISC)&#xff1a;ARM 采用 RISC 结构&#xff0c;指令集较小且简单&#xff0c;执行效率高。相比于复杂指令集 (CISC)&#xff0c;RISC 更强调每条指令的执行速度。低功耗设计&#xff1a;ARM 处理…...

【unity踩坑】打开vs2022没有文字联想/杂项文件

unity打开vs2022没有文字联想 修改外置编辑器安装unity开发插件vs编辑器显示杂项文件 修改外置编辑器安装unity开发插件 参考 在unity项目里选择Edit-> Preferences->External Tools然后更换编辑器 在vs工具界面添加unity游戏开发选项。 重新打开还是有问题&#xff…...

WebGoat JAVA反序列化漏洞源码分析

目录 InsecureDeserializationTask.java 代码分析 反序列化漏洞知识补充 VulnerableTaskHolder类分析 poc 编写 WebGoat 靶场地址&#xff1a;GitHub - WebGoat/WebGoat: WebGoat is a deliberately insecure application 这里就不介绍怎么搭建了&#xff0c;可以参考其他…...

大数据-161 Apache Kylin 构建Cube 按照日期、区域、产品、渠道 与 Cube 优化

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...

uni-app使用v-show编译成微信小程序的问题

问题 在uni-app使用v-show语法编译成微信小程序会有一个问题 当我们设置成v-show"false" 在Hbuilder X里面确实没有显示 然后运行到 微信开发程序里面 发现显示了出来&#xff0c;说明设置的 v-show"false"没有起作用 解决办法 首先去uniapp官网查看v…...

充电宝租赁管理系统网站毕业设计SpringBootSSM框架开发

目录 1. 概述 2. 技术选择与介绍 3. 系统设计 4. 功能实现 5. 需求分析 1. 概述 充电宝租赁管理系统网站是一个既实用又具有挑战性的项目。 随着移动设备的普及和人们日常生活对电力的持续依赖&#xff0c;充电宝租赁服务已成为现代都市生活中的一项重要便利设施。它不仅为…...

喜讯!迈威通信TSN产品通过“时间敏感网络(TSN)产业链名录计划”评测,各项指标名列前茅

TSN技术&#xff0c;作为推动企业网络化与智能化转型的关键力量&#xff0c;已成为工业网络迈向下一代演进的共识方向&#xff0c;正加速重构工业网络的技术架构与产业生态。为响应这一趋势&#xff0c;工业互联网产业联盟携手中国信息通信研究院及50余家产学研用单位&#xff…...

国产工具链GCKontrol-GCAir助力控制律开发快速验证

前言 随着航空领域技术的不断发展&#xff0c;飞机的飞行品质评估和优化成为了航空领域的一个重要任务&#xff0c;为了确保飞行器在各种复杂条件下的稳定性&#xff0c;控制律设计过程中的模型和数据验证需要大量仿真和测试。 本文将探讨基于世冠科技的国产软件工具链GCKont…...

嵌入式开发:STM32 硬件 CRC 使用

测试平台&#xff1a;STM32G474系列 STM32硬件的CRC不占用MCU的资源&#xff0c;计算速度快。由于硬件CRC需要配置一些选项&#xff0c;配置不对就会导致计算结果错误&#xff0c;导致使用上没有软件计算CRC方便。但硬件CRC更快的速度在一些有时间资源要求的场合还是非…...

基于STM32的智能家居语音控制系统:集成LD3320、ESP8266设计流程

一、项目概述 项目目标和用途 近年来&#xff0c;智能家居产品逐渐成为家庭生活中不可或缺的一部分。为了提升家庭生活的便捷性和舒适度&#xff0c;本项目旨在设计一款基于STM32F407VGT6&#xff08;Cortex-M4内核&#xff09;微控制器的多功能智能家居语音控制系统。该系统…...

【docker】要将容器中的 livox_to_pointcloud2 文件夹复制到宿主机上

复制文件夹 使用 docker cp 命令从容器复制文件夹到宿主机&#xff1a; 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的方式&#xff0c;一个IOServicePool开启n个线程和n个iocontext&#xff0c;每个线程内独立运行iocontext, 各个iocontext监听各自绑定的socket是否就绪&#xff0c;如果就绪就在各自线程里触发回调函数。为避免线程安全问题&#xf…...

【rust/egui/android】在android中使用egui库

文章目录 说在前面AndroidStudio安装编译安装运行问题 说在前面 操作系统&#xff1a;windows11java版本&#xff1a;23android sdk版本&#xff1a;35android ndk版本&#xff1a;22rust版本&#xff1a; AndroidStudio安装 安装AndroidStudio是为了安装sdk、ndk&#xff0c;…...

Git---Git打标签

打标签 像其他版本控制系统&#xff08;VCS&#xff09;一样&#xff0c;Git 可以给仓库历史中的某一个提交打上标签&#xff0c;以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点&#xff08; v1.0 、 v2.0 等等&#xff09;。 在本节中&#xff0c;你将会学习如…...

深入理解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# 检查系统是…...

博士找高校教职避坑指南:史上最全的避坑秘籍

在学术的海洋中遨游多年&#xff0c;博士们终于要踏上寻找高校教职的征程。这不仅是职业生涯的新起点&#xff0c;更是一场充满未知与挑战的冒险。今天&#xff0c;就让我们来聊聊那些在寻找高校教职时需要避开的坑&#xff0c;希望能为你的求职之路保驾护航。 1. 薪资结构&am…...

Study-Oracle-11-ORALCE19C-ADG集群搭建

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。 一、ORACLE--ADG VS ORACLE--DG的区别 1、DG是Oracle数据库的一种灾难恢复和数据保护解决方案,它通过在主数据库和一个或多个备用数据库之间实时复制数据,提供了数据的冗余备份和故障切换功能。…...

【C++】map详解(键值对的概念,与multimap的不同)

目录 00.引言 set 和 map 的区别 键值对的概念 01.map容器 主要特性 常用操作 主要用途 02.multimap容器 特性 常用操作 用途 00.引言 set 和 map 的区别 set 和 map 都是C标准模板库&#xff08;STL&#xff09;中的容器&#xff0c;它们的区别如下&#xff1a;…...

私域电商新纪元:消费增值模式引领百万业绩飞跃

各位朋友&#xff0c;我是吴军&#xff0c;专注于带领大家深入探索私域电商领域的非凡魅力与潜在机会。 今天&#xff0c;我想与大家分享一个鼓舞人心的真实故事。在短短的一个月内&#xff0c;我们的合作伙伴实现了业绩的飞跃&#xff0c;突破百万大关&#xff0c;并且用户活跃…...

AAA Mysql与redis的主从复制原理

一 &#xff1a;Mysql主从复制 重要的两个日志文件&#xff1a;bin log 和 relay log bin log&#xff1a;二进制日志&#xff08;binnary log&#xff09;以事件形式记录了对MySQL数据库执行更改的所有操作。 relay log&#xff1a;用来保存从节点I/O线程接受的bin log日志…...

结合大语言模型的机械臂抓取操作学习

一、 大语言模型的机械臂抓取操作关键步骤 介绍如何基于大语言模型实现机械臂在PyBullet环境中的抓取操作&#xff0c;涵盖机器人运动学、坐标系转换、抓取候选位姿生成、开放词汇检测以及大语言模型代码生成等模块。 1. 机器人正逆运动学基本概念 正运动学: 已知机器人的关节…...

数据结构-二叉树_堆

一. 树的概念 树在我们的日常生活中随处可见&#xff0c;人们将生活中的树转换成存放数据的树形结构&#xff0c;就成了数据结构中的“树”。 如上图所示&#xff0c;自然界中的树有树根&#xff0c;有树枝&#xff0c;有树叶&#xff0c;当我们将其转换成树形结构时&#xf…...

Vscode+Pycharm+Vue.js+WEUI+django火锅(三)理解Vue

新创建的Vue项目里面很多文件&#xff0c;对于新手&#xff0c;老老实实做一下了解。 1.框架逻辑 框架的逻辑都是相通的&#xff0c;花点时间理一下就清晰了。 2.文件目录及文件 创建好的vue项目下&#xff0c;主要的文件和文件夹要先认识一下&#xff0c;并与框架逻辑对应起…...

溯变:守护天使 | OPENAIGC开发者大赛企业组优秀作品

在第二届拯救者杯OPENAIGC开发者大赛中&#xff0c;涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到&#xff0c;我们特意开设了优秀作品报道专栏&#xff0c;旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者&#xff0c;希望能带给…...

android中byte[] buf没有结束符,new String(buf)会不会出错?

答案是&#xff1a;不会 看例子&#xff1a; 这和c是不一样的&#xff0c;不需要特别的在字符串后面添加一个\0结束....

鸿蒙harmonyos next flutter混合开发之开发plugin(获取操作系统版本号)

创建Plugin为my_plugin flutter create --org com.example --templateplugin --platformsandroid,ios,ohos my_plugin 创建Application为my_application flutter create --org com.example my_application flutter_application引用flutter_plugin&#xff0c;在pubspec.yam…...