学习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)是一种行为型设计模式,定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式允许客户端在运行时选择算法的具体实现ÿ…...
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 判断一个数组是否可以变为有序 这题我比赛时用的并查集。看灵神视频学了个分组循环的做法。 对于每个分组,如果可以交换,则扩展分组的窗口,直至…...
《WebKit 技术内幕》学习之九(4): JavaScript引擎
4 实践——高效的JavaScript代码 4.1 编程方式 关于如何使用JavaScript语言来编写高效的代码,有很多铺天盖地的经验分享,以及很多特别好的建议,读者可以搜索相关的词条,就能获得一些你可能需要的结果。同时,本节希望…...
[SpringBoot2.6.13]FastJsonHttpMessageConverter不生效
文章目录 错误描述问题分析打印目前所有的消息处理器寻找适配版本消息解释器加载顺序 错误原因正确写法使用最新版本fastjson(2024-1-22)配置fastjson2消息转换器(保留系统原消息转换器)替换消息转换器配置fastjson2 错误描述 采用Bean的方式配置FastJsonHttpMessageConverter…...
(delphi11最新学习资料) Object Pascal 学习笔记---第3章第一节(简单语句与复合语句)
Object Pascal 学习笔记,Delphi 11 编程语言的完整介绍 作者: Marco Cantu 笔记:豆豆爸 3.1 简单语句与复合语句 编程指令通常称为语句。一个程序块可以由多个语句组成。有两种类型的语句,简单语句和复合语句。当语句不包含任何其他子语…...
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、微服务概述 本案例主要解决微服务之间的相互调用问题 如果已经理解什么是微服务,可以直接跳到实战。 本案例采用springBoot3.1.7springCloud2022.0.4版本测试 本案例使用springboot2.7.x版本测试代码相同 1、微服务是分布式架构,那么为什么要需要…...
Axios取消请求:AbortController
AbortController AbortController() 构造函数创建了一个新的 AbortController 实例。MDN官网给出了一个利用AbortController取消下载视频的例子。 核心逻辑是:利用AbortController接口的只读属性signal标记fetch请求;然后在需要取消请求的时候࿰…...
【江科大】STM32:(超级详细)定时器输出比较
文章目录 输出比较单元特点 高级定时器:均有4个通道 PWM简介PWM(Pulse Width Modulation)脉冲宽度调制输出比较通道PWM基本结构基本定时器 参数计算捕获/比较通道的输出部分详细介绍如下: 舵机介绍硬件电路 直流电机介绍ÿ…...
Go 复合数据类型
1. 数组(array)(OK) 数组数组的概念数组是具有固定长度且拥有零个或多个相同数据类型元素的序列 i. 元素的数据类型相同 ii. 长度固定的序列 iii. 零个或多个元素的序列 与 slice 对比 由于数组的长度固定,所以在 G…...
Redis(01)——常用指令
基础指令 select 数字:切换到其他数据库flushdb:清空当前数据库flushall:清空所有数据库dbsize:查看数据库大小exists key1[key2 …]:判断当前的key是否存在keys *:查看所有的keyexpire key 时间ÿ…...
基本语法和 package 与 jar
3.基本语法 1.输入输出 // 导入 java.util 包中的 Scanner 类 import java.util.Scanner;// 定义名为 ScannerExample 的公共类 public class ScannerExample {// 主方法,程序的入口点public static void main(String[] args) {// 创建 Scanner 对象,用…...
LockSupport深度解析:线程阻塞与唤醒的底层实现原理
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
UI-TARS-desktop场景应用:自动生成销售报告与更新库存实战
UI-TARS-desktop场景应用:自动生成销售报告与更新库存实战 1. 场景痛点与解决方案 1.1 传统销售管理的效率瓶颈 在零售和电商行业中,销售数据分析和库存管理是日常运营的核心工作。传统方式通常需要: 手动从多个系统导出销售数据人工整理…...
Fish Speech 1.5 Web界面保姆级教程:上传参考音频→文本对齐→语音生成全链路
Fish Speech 1.5 Web界面保姆级教程:上传参考音频→文本对齐→语音生成全链路 你是不是也想用AI生成和自己声音一模一样的语音?Fish Speech 1.5就能帮你实现这个愿望!这个强大的语音合成工具不仅能生成自然流畅的语音,还能通过参…...
Qwen-Image-2512图片生成服务:支持多种宽高比,满足不同场景需求
Qwen-Image-2512图片生成服务:支持多种宽高比,满足不同场景需求 1. 引言:为什么宽高比如此重要? 在数字内容创作领域,图片的宽高比往往决定了它的最终用途。一张构图精美的图片,如果比例与展示平台不匹配…...
基于卷积神经网络的忍者像素绘卷风格迁移:从原理到实战部署
基于卷积神经网络的忍者像素绘卷风格迁移:从原理到实战部署 1. 引言:当AI遇见像素艺术 想象一下,你手头有一张普通的照片,但希望它能变成复古游戏里的忍者像素风格——就像那些经典的街机游戏画面。这听起来像是需要专业美术师才…...
PyTorch核心模块实战指南:从nn.Sequential到nn.MaxPool2d的深度解析
1. 快速上手nn.Sequential:像搭积木一样构建神经网络 第一次接触PyTorch时,我被各种复杂的网络结构吓到了——直到发现nn.Sequential这个"乐高积木盒"。这个容器让我能用拼积木的方式组合网络层,比如下面这个图像分类器的经典结构&…...
轻量化之路:使用模型剪枝与量化技术压缩卡证检测模型
轻量化之路:使用模型剪枝与量化技术压缩卡证检测模型 1. 引言 你有没有遇到过这样的场景?想把一个识别身份证、银行卡的AI模型塞进手机App里,或者部署到一台小小的工控机上,结果发现模型动辄几百兆,跑起来慢吞吞&…...
Pixel Dream Workshop 企业级部署架构:基于 Docker 的高可用方案
Pixel Dream Workshop 企业级部署架构:基于 Docker 的高可用方案 1. 为什么企业需要高可用部署方案 当Pixel Dream Workshop从开发测试环境走向生产环境时,稳定性、扩展性和可维护性就成为了关键考量。想象一下,当营销团队急需批量生成节日…...
Qwen3.5-2B图文理解教程:GIF动图逐帧理解+动态内容总结生成方法
Qwen3.5-2B图文理解教程:GIF动图逐帧理解动态内容总结生成方法 1. 引言 Qwen3.5-2B是一款轻量化多模态基础模型,属于Qwen3.5系列的小参数版本(20亿参数)。这款模型主打低功耗、低门槛部署,特别适配端侧和边缘设备&am…...
nlp_structbert_sentence-similarity_chinese-large保姆级教学:模型路径自定义、多模型切换、Web界面汉化配置
nlp_structbert_sentence-similarity_chinese-large保姆级教学:模型路径自定义、多模型切换、Web界面汉化配置 1. 引言:为什么需要这个工具? 你是不是经常遇到这样的情况:需要判断两段中文文字是不是表达同一个意思,…...
