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

学习JavaEE的日子 day14 继承,super(),this(),重写

Day14

1.继承的使用

理解:子类继承父类所有的属性和方法

使用场景:多个类似的类,有相同的属性和方法,就可以把相同属性和方法抽取到父类

优点:减少代码的冗余; 使类与类之间产生了关系(多态的前提)

缺点:继承会增加类与类之间的关系,会增加代码的维护难度

需求:编写中国人和日本人的类,创建各自的对象

分析:

  人类:属性:姓名、性别、年龄方法:吃饭饭、睡觉觉中国人的类 继承 人类 :属性:身份证方法:打太极日本人的类 继承 人类:属性:年号

​ 方法:拍电影

//父类
public class Person {String name;char sex;int age;public void eat(){System.out.println(this.name + "吃饭饭");}public void sleep(){System.out.println(this.name + "睡觉觉");}
}
//            子类           继承        父类
public class Chinese extends Person{String id;public void playTaiJi(){System.out.println("中国人打太极");}
}
//			     子类           继承        父类
public class Japanese extends Person{String yearNum;public void playVideo(){System.out.println("日本人拍电影");}
}
//测试类
public class Test01 {public static void main(String[] args) {//创建对象Chinese c = new Chinese();//操作父类属性c.name = "小彭";c.sex = '男';c.age = 21;//操作子类属性c.id = "1234567890";//调用父类方法c.eat();c.sleep();//调用子类方法c.playTaiJi();System.out.println("-----------------------------");//创建对象Japanese j = new Japanese();//操作父类属性j.name = "波多野结衣";j.sex = '女';j.age = 18;//操作子类属性j.yearNum = "令和";//调用父类方法j.eat();j.sleep();//调用子类方法j.playVideo();}
}

继承内存图:

在这里插入图片描述

父类空间优先于子类对象产生

在每次创建子类对象时,先初始化父类空间,再创建其子类对象本身。目的在于子类对象中包含了其对应的父类空间,便可以包含其父类的成员,如果父类成员非private修饰,则子类可以随意使用父类成员。代码体现在子类的构造方法调用时,一定先调用父类的构造方法

小结

1.继承实际上是子类相同的属性和行为可以定义在父类中,子类特有的属性和行为由自己定义,这样就实现了相同属性和行为的重复利用,从而提高了代码复用。

2.继承是在多个类中之间的,使用关键字extends,在父类的非私有属性和方法可以被子类继承

3.java是单继承的

2.继承的深入

面试题

1.创建子类对象,会调用父类的构造方法吗?

2.创建子类对象,为什么会调用父类构造方法?

因为会在子类对象中开辟空间,用于存储父类的成员属性

3.创建子类对象,先调用父类构造方法还是子类构造方法?

先调用子类的构造方法

4.创建子类对象,先完成父类构造方法还是子类构造方法?

先完成父类的构造方法

5.子类对象是否能继承父类所有的属性和方法?

Java官网上,明确表示子类不能继承父类私有化的属性和方法,这是站在使用的角度

实际上,子类能继承父类私有化的属性方法,但是不能直接使用,可以在父类中编写公有方法去调用私有的属性和方法

*值得注意的是子类可以继承父类的私有成员(成员变量,方法),只是子类无法直接访问而已,可以通过在父类中设置get/set方法访问父类的private成员变量。*

public class Father {
private String fatherAttr = "父类私有化属性";public Father() {System.out.println("调用父类的构造方法");
}public String getFatherAttr() {return fatherAttr;
}public void setFatherAttr(String fatherAttr) {this.fatherAttr = fatherAttr;
}private void method01(){System.out.println("父类私有化方法");
}public void method02(){method01();
}
}
public class Son extends Father{public Son() {//super();//默认实现:调用父类的构造方法,所以首先完成父类构造方法,再执行下一句System.out.println("调用子类的构造方法");}
}
//测试类
public class Test01 {public static void main(String[] args) {Son son = new Son();System.out.println(son.getFatherAttr());son.method02();}
}

3.super

理解:super表示父类

super代表的是父类对象的引用,this代表的是当前对象的引用。*

作用:

1.super.属性:在子类中,调用父类的非私有化的成员属性(不常用,因为属性已经私有化了)

2.super.方法:在子类中,调用父类的非私有化的成员方法

3.super():在子类构造方法中的第一句调用父类的非私有化的构造方法

需求:编写中国人和日本人的类,创建各自的对象

public class Person {private String name;public Person() {}public Person(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public void eat(){System.out.println(this.name + "吃饭饭");//name这个属性是本类的,所以使用this,而不是super}
}
public class Chinese extends Person{private String id;public Chinese() {}public Chinese(String name,String id) {super(name);//子类中把父类的成员变量一起有参构造出来,方便使用this.id = id;}public String getId() {return id;}public void setId(String id) {this.id = id;}public void playTaiJi(){System.out.println(super.getName() + "打太极");//super.属性:用的是分类的成员变量,子类中没有名字这个属性}
}
public class Japanese extends Person{private String yearNum;public Japanese() {}public Japanese(String name,String yearNum) {super(name);this.yearNum = yearNum;}public String getYearNum() {return yearNum;}public void setYearNum(String yearNum) {this.yearNum = yearNum;}public void playVideo(){System.out.println(super.getName() + "拍电影");//super.属性:用的是分类的成员变量,子类中没有名字这个属性}
}
public class Test01 {public static void main(String[] args) {//创建对象Chinese c = new Chinese("小彭", "1234567890");//调用父类方法c.eat();//调用子类方法c.playTaiJi();System.out.println("-----------------------------");//创建对象Japanese j = new Japanese("波多野结衣",  "令和");//调用父类方法j.eat();//调用子类方法j.playVideo();}
}

小结 - 编写一个类的步骤:

1.属性

2.私有化属性

3.无参构造

4.有参构造

5.get/set方法

6.其他的方法

3.1 继承后的特点——构造方法

构造方法的名字是与类名一致的。

构造方法的作用是初始化对象成员变量数据的。所以子类的初始化过程中,必须先执行父类的初始化动作。子类的构造方法中默认有一个super() ,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。(*先有爸爸,才能有儿子*

*继承后子类构方法器特点:子类所有构造方法的第一行都会默认先调用父类的无参构造方法*****

子类构造方法的第一行都隐含了一个super()调用父类无参数构造方法,super()可以省略不写。

3.2 super和this的用法格式

this.成员变量 – 本类的

this.成员方法名() – 本类的

super.成员变量 – 父类的

super.成员方法名() – 父类的

接下来我们使用调用构造方法格式:

this(…) – 调用本类的其他构造方法,根据参数匹配确认

super(…) – 调用父类的构造方法,根据参数匹配确认

注意:

*子类的每个构造方法中均有默认的super(),调用父类的空参构造。手动调用父类构造会覆盖默认的super()。*

*super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。*

4.重写/复写

理解:在子类中,将父类的方法重新写一遍

子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。*声明不变,重新实现*

应用场景:父类方法不能被改动时,在子类中重新写一遍

条件:

1.在子类中重写父类的方法

2.返回值、方法名、参数列表必须跟父类重写的方法一致

3.访问修饰符不能比父类更严格

面试题:重写(overriding)与重载(overloading)的区别?

重写是发生在子父类继承关系中方法名相同,参数列表相同,返回值相同,子类访问修饰符要大于等于父类的修饰符,子类的异常声明必须小于等于父类的异常声明;

方法重载发生在同一个类中,方法名相同,参数列表不同,返回值无关。

需求:编写中国人和日本人的类,创建各自的对象

public class Test01 {	public static void main(String[] args) {//创建对象Chinese c = new Chinese("小彭", "1234567890");c.eat();//调用子类重写后的方法System.out.println("-----------------------------");//创建对象Japanese j = new Japanese("波多野结衣","令和");j.eat();//调用子类重写后的方法}
}
public class Person {private String name;public Person() {}public Person(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public void eat(){System.out.println(this.name + "吃饭饭");}
}
public class Chinese extends Person{private String id;public Chinese() {}public Chinese(String name, String id) {super(name);this.id = id;}public String getId() {return id;}public void setId(String id) {this.id = id;}//@Override -- 重写的注解//注解:给程序员和系统解释代码信息@Overridepublic void eat(){System.out.println(super.getName() + "吃山珍海味");}
}
public class Japanese extends Person{private String yearNum;public Japanese() {}public Japanese(String name,String yearNum) {super(name);this.yearNum = yearNum;}public String getYearNum() {return yearNum;}public void setYearNum(String yearNum) {this.yearNum = yearNum;}@Overridepublic void eat() {System.out.println(super.getName() + "吃生鱼片");}
}

4.1 @Override重写注解

@Override:注解,重写注解校验!

这个注解标记的方法,就说明这个方法必须是重写父类的方法,否则编译阶段报错。

建议重写都加上这个注解,一方面可以提高代码的可读性,一方面可以防止重写出错!

4.2 注意事项

1.方法重写是发生在子父类之间的关系。

2.子类方法覆盖父类方法,必须要保证权限大于等于父类权限。

3.子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样。

4.父类中的方法使用private,static,final任意修饰符,那么,不能被子类重写。

5.总结

1.继承的使用

2.继承的深入 — 重要

3.super

4.重写

相关文章:

学习JavaEE的日子 day14 继承,super(),this(),重写

Day14 1.继承的使用 理解:子类继承父类所有的属性和方法 使用场景:多个类似的类,有相同的属性和方法,就可以把相同属性和方法抽取到父类 优点:减少代码的冗余; 使类与类之间产生了关系(多态的前提) 缺点&a…...

一文梳理Windows自启动位置

不同版本的Windows开机自启动的位置略有出入,一般来说,Windows自启动的位置有:自启动文件夹、注册表子键、自动批处理文件、系统配置文件等。如果计算机感染了木马,很有可能就潜伏于其中!本文将说明这些常见的Windows开…...

【Java 设计模式】行为型之策略模式

文章目录 1. 定义2. 应用场景3. 代码实现结语 策略模式(Strategy Pattern)是一种行为型设计模式,定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式允许客户端在运行时选择算法的具体实现&#xff…...

go实现判断20000数据范围内哪些是素数(只能被1和它本身整除的数),采用多协程和管道实现

实现一个并发程序,用于寻找 20000 以内的所有素数。使用了 Goroutines 和 Channels 来分发和处理任务,并通过 WaitGroup(实现为 exitChan)来同步 Goroutines 的退出。 一.GO代码 package mainimport ("fmt""time…...

GPT只是开始,Autonomous Agents即将到来

生成式AI虽然很早便已经引起了广泛关注,但直到ChatGPT的出现,许多公司的领导层才切身感受到了大语言模型(LLM)带来的深远影响。面临这种行业变革,诸多企业正争先恐后地加入到这场潮流中,但生成式AI的进步速…...

ubuntu source: not found

1、原因分析: shell 的解释器不是 bash,需把 shell 的解释器更改为 bash 2、ls -l /bin/sh 3、sudo dpkg-reconfigure dash 选择No 4、ls -l /bin/sh 5、reboot(此步必须持续,否则无效)...

Rancher部署k8s集群测试安装nginx(节点重新初始化方法,亲测)

目录 一、安装前准备工作计算机升级linux内核时间同步Hostname设置hosts设置关闭防火墙,selinux关闭swap安装docker 二、安装rancher部署rancher 三、安装k8s安装k8s集群易错点,重新初始化 四、安装kutectl五、测试安装nginx工作负载 一、安装前准备工作…...

SpringBoot结合thymeleaf的HTML页面不能跳转问题踩坑

问题描述:写了一个上传接口,controller不能跳转到thymeleaf的HTML页面“uploadsuccess”,试了好几个方法,都不起作用,后来发现是注解ResponseBody 的原因,把ResponseBody 去掉,问题解决,记录一下…...

Apache Zeppelin结合Apache Airflow使用1

Apache Zeppelin结合Apache Airflow使用1 文章目录 Apache Zeppelin结合Apache Airflow使用1前言一、安装Airflow二、使用步骤1.目标2.编写DAG2.加载、执行DAG 总结 前言 之前学了Zeppelin的使用,今天开始结合Airflow串任务。 Apache Airflow和Apache Zeppelin是两…...

分组循环A

模板 i 0 while(i<n){start iwhile( i<n && check(args) ) {i1} }1. LC 3011 判断一个数组是否可以变为有序 这题我比赛时用的并查集。看灵神视频学了个分组循环的做法。 对于每个分组&#xff0c;如果可以交换&#xff0c;则扩展分组的窗口&#xff0c;直至…...

《WebKit 技术内幕》学习之九(4): JavaScript引擎

4 实践——高效的JavaScript代码 4.1 编程方式 关于如何使用JavaScript语言来编写高效的代码&#xff0c;有很多铺天盖地的经验分享&#xff0c;以及很多特别好的建议&#xff0c;读者可以搜索相关的词条&#xff0c;就能获得一些你可能需要的结果。同时&#xff0c;本节希望…...

[SpringBoot2.6.13]FastJsonHttpMessageConverter不生效

文章目录 错误描述问题分析打印目前所有的消息处理器寻找适配版本消息解释器加载顺序 错误原因正确写法使用最新版本fastjson(2024-1-22)配置fastjson2消息转换器(保留系统原消息转换器)替换消息转换器配置fastjson2 错误描述 采用Bean的方式配置FastJsonHttpMessageConverter…...

(delphi11最新学习资料) Object Pascal 学习笔记---第3章第一节(简单语句与复合语句)

Object Pascal 学习笔记&#xff0c;Delphi 11 编程语言的完整介绍 作者: Marco Cantu 笔记&#xff1a;豆豆爸 3.1 简单语句与复合语句 ​ 编程指令通常称为语句。一个程序块可以由多个语句组成。有两种类型的语句&#xff0c;简单语句和复合语句。当语句不包含任何其他子语…...

Unity - 简单音频

“Test_04” AudioTest public class AudioTest : MonoBehaviour {// 声明音频// AudioClippublic AudioClip music;public AudioClip se;// 声明播放器组件private AudioSource player;void Start(){// 获取播放器组件player GetComponent<AudioSource>();// 赋值…...

SpringCloud中服务间通信(应用间通信)-亲测有效-源码下载-连载2

1、微服务概述 本案例主要解决微服务之间的相互调用问题 如果已经理解什么是微服务&#xff0c;可以直接跳到实战。 本案例采用springBoot3.1.7springCloud2022.0.4版本测试 本案例使用springboot2.7.x版本测试代码相同 1、微服务是分布式架构&#xff0c;那么为什么要需要…...

Axios取消请求:AbortController

AbortController AbortController() 构造函数创建了一个新的 AbortController 实例。MDN官网给出了一个利用AbortController取消下载视频的例子。 核心逻辑是&#xff1a;利用AbortController接口的只读属性signal标记fetch请求&#xff1b;然后在需要取消请求的时候&#xff0…...

【江科大】STM32:(超级详细)定时器输出比较

文章目录 输出比较单元特点 高级定时器&#xff1a;均有4个通道 PWM简介PWM&#xff08;Pulse Width Modulation&#xff09;脉冲宽度调制输出比较通道PWM基本结构基本定时器 参数计算捕获/比较通道的输出部分详细介绍如下&#xff1a; 舵机介绍硬件电路 直流电机介绍&#xff…...

Go 复合数据类型

1. 数组&#xff08;array&#xff09;&#xff08;OK&#xff09; 数组数组的概念数组是具有固定长度且拥有零个或多个相同数据类型元素的序列 i. 元素的数据类型相同 ii. 长度固定的序列 iii. 零个或多个元素的序列 与 slice 对比 由于数组的长度固定&#xff0c;所以在 G…...

Redis(01)——常用指令

基础指令 select 数字&#xff1a;切换到其他数据库flushdb&#xff1a;清空当前数据库flushall&#xff1a;清空所有数据库dbsize&#xff1a;查看数据库大小exists key1[key2 …]&#xff1a;判断当前的key是否存在keys *&#xff1a;查看所有的keyexpire key 时间&#xff…...

基本语法和 package 与 jar

3.基本语法 1.输入输出 // 导入 java.util 包中的 Scanner 类 import java.util.Scanner;// 定义名为 ScannerExample 的公共类 public class ScannerExample {// 主方法&#xff0c;程序的入口点public static void main(String[] args) {// 创建 Scanner 对象&#xff0c;用…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...