【自学笔记】01Java基础-07面向对象基础-02继承
记录学习Java基础中有关继承、方法重写、构造器调用的基础知识,学习继承之前建议学习static关键字的内容【自学笔记】01Java基础-09Java关键字详解
1 继承概述
1.1 什么是继承?




1.2 继承的特点
- 子类可以继承父类的属性和行为,但是子类不能继承父类的构造器。
- Java是单继承模式:一个类只能继承一个直接父类。
- Java不支持多继承、但是支持多层继承。
- Java中所有的类都是Object类的子类。
1.3 继承的重要问题
1.3.1 子类是否可以继承父类的构造器?
不可以的,子类有自己的构造器,父类构造器用于初始化父类对象。
1.3.2 子类是否可以继承父类的私有成员(方法,变量)?
可以的,只是不能直接访问。
具体表现如下:
- 子类不能直接引用父类的私有字段(成员变量)。
- 子类不能覆盖(override)父类的私有方法。
- 子类可以通过调用父类提供的公共(public)或受保护(protected)方法来间接访问或者修改私有字段的值,前提是父类提供了这样的接口。
例如,在父类中有一个私有变量,并且提供了一个公共的getter和setter方法,那么子类就可以通过调用这些方法来读取和设置该私有变量的值。
1.3.3 子类是否可以继承父类的静态成员?
有争议的知识点。
子类可以直接使用父类的静态成员(共享)
但个人认为:子类不能继承父类的静态成员。(共享并非继承)
Java中,静态成员(包括静态变量和静态方法)是与类关联的,而不是与对象实例关联。因此子类可以直接访问父类的静态成员,但不会重新创建或覆盖这些成员。
public class Parent {public static int count = 0;// 静态方法public static void incrementCount() {count++;}
}public class Child extends Parent {// 子类无需定义count,直接可以使用Parent.countpublic static void main(String[] args) {// 直接通过类名访问父类的静态成员System.out.println(Parent.count); // 输出:0Parent.incrementCount();System.out.println(Parent.count); // 输出:1System.out.println(Child.count); // 输出:1,因为Child和Parent共享同一个静态变量count}
}
在这个例子中,Child 类和 Parent 类共享同一个 count 变量。同样,Child 类也可以调用 Parent 中的public静态方法 incrementCount()。但是,子类不能重写父类的静态方法,只能重新声明一个同名的静态方法,这将被视为一个新的方法而非覆盖。
1.4 继承后方法、变量的访问优先级
满足就近原则。
- 先子类局部范围找
- 然后子类成员范围找
- 然后父类成员范围找,如果父类范围还没有找到则报错。
当子类中方法或变量与父类重名时,会优先使用子类的,此时如何指定使用父类的方法或变量?
可以通过super.父类成员变量/父类成员方法,指定访问父类的成员。了解super关键字
1.5 子类如何声明与父类同名的变量的两种方式
子类中想声明与父类同名的变量时有两种情况:
- 对于父类中static修饰的静态变量(类变量),子类必须声明为static类型。子类和父类的static同名变量各自独立,前面学过了子类中使用父类中static变量直接
类名.变量,可以查看了解static关键字
public class Parent {public static int count = 10;
}public class Child extends Parent {public static int count = 20;public static void main(String[] args) {System.out.println(Parent.count); // 输出:10System.out.println(Child.count); // 输出:20}
}
- 对于父类中非static修饰的实例变量,子类可以声明与父类同名的非static变量,可以使用
this关键字来获取当前作用域内的非静态变量,用super来获取父类的非静态变量。
public class Parent {public int count = 10;
}public class Child extends Parent {public int count = 20; // 子类中声明了与父类同名的实例变量public void displayCounts() {System.out.println("Parent count: " + super.count);System.out.println("Child count: " + this.count);}public static void main(String[] args) {Child child = new Child();child.displayCounts(); // 输出:// Parent count: 10// Child count: 20}
}
2 方法重写

public class Animal {public void makeSound() {System.out.println("动物发出叫声");}
}public class Dog extends Animal {@Override // 标注此方法是重写父类Animal的makeSound方法public void makeSound() {System.out.println("狗叫汪汪汪");}
}
2.1 @Override重写注解的作用
在上方示例代码中,重写的方法makeSound()上方出现了@Override注解。
- Override注解放在重写后的方法上,作为重写是否正确的校验注解。
- 加上该注解后如果重写错误,编译阶段会出现错误提示。
- 建议重写方法都加@Override注解,代码安全,优雅!也并非一定要加。
2.2 方法重写的注意事项
- 子类必须继承自父类。
- 重写方法的名称、形参列表、返回类型必须与被重写方法的一致。
- private私有方法和static静态方法不能被重写。
- 子类重写父类方法时,访问权限必须大于或者等于父类 (权限范围:缺省 < protected < public)
- 重写的方法抛出的异常类型不能大于父类对应方法允许抛出的异常类型,也就是说,子类重写的方法可以不抛出异常,或者抛出父类方法所声明异常的子类异常。
3 子类构造器
复习构造器的概念 > 封装-构造方法
子类并不继承父类的构造器,而是在自己构造器调用父类构造器来初始化从父类继承而来的成员变量。
- 子类可以通过
super关键字在构造器内部明确调用父类的一个构造器,从而初始化父类的状态。 - 调用语句
super();必须是子类构造器中第一行,并且一个构造器中只能出现一次。如果显示写明就是显式调用,如果没写也会存在,为隐式调用。 super()的"()"中可以填入参数,以此调用父类有参构造器,将会通过指定的参数名称、数量、排序来判断调用的父类中的哪个有参构造器。
显式调用:
public class Parent {public int value;// 父类构造器public Parent(int value) {this.value = value;}
}public class Child extends Parent {public String name;// 显式调用父类构造器public Child(int parentValue, String childName) {super(parentValue); // 调用Parent类的构造器this.name = childName;}
- 即使没有显式地调用父类构造器,子类构造器第一行也会自动插入一个父类无参构造器的隐式调用:
“super();”。 - 如果父类没有无参构造器,那么子类必须显式调用一个带有参数的父类构造器;反之如果没有显式调用父类有参构造器,则父类必须存在无参构造能被默认隐式调用。
隐式调用:
// 若不显式调用,则会默认调用父类无参构造器(若存在)// 如果Parent类没有无参构造器,则此处会出错,需要显示调用带参构造器public Child(String childName) {//super();//第一句默认调用父类无参构造器,即使不写也默认存在this.name = childName;}
}
3.1 子类构造器调用父类有哪些情况?
前言:
我们知道在实体类中没有定义任何构造器时,系统会自动提供一个默认(无参)构造器。
一旦定义了至少一个构造器(无论是否有参数),Java编译器将不再自动提供无参构造器。这时若需无参构造器来创建对象,那么必须手动提供一个无参构造器,否则将会报错。
所以子类构造器调用父类有以下情况:
- 父类没有显式定义任何构造器,此时默认有无参构造器,子类会默认隐式调用父类无参构造器
- 父类显式定义了无参构造器,此时子类会默认隐式调用父类无参构造器。
- 父类显式定义了有参构造器,此时子类必须显式调用
super(...)至少一个有参构造器,否则因为无法找到默认无参构造器报错。 - 父类显式定义了有参构造器和无参构造器,此时子类会默认隐式调用无参构造器,也可以显式调用任一构造器。
3.2 子类为什么必须调用父类构造器?
- 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。
- 子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化。
4 this和super关键字使用总结

-
this 关键字:
- 表示当前对象引用,它总是指向调用该方法或构造器的对象实例。
- 在方法内部,
this可以用来引用当前对象的属性或方法:class Person {String name;public Person(String name) {this.name = name; // 使用 this 引用当前实例对象的 name 属性,并将传入的形参name赋值给它}public void showName() {System.out.println(this.name); // 使用 this 引用当前对象的 name 属性} } - 当成员变量与局部变量同名时,
this用于区分二者:class MyClass {int value;public void setValue(int value) {this.value = value; // 设置的是成员变量 value,而不是方法参数} } this还可以作为方法或构造器的参数传递当前对象引用:class AnotherClass {public void process(MyClass obj) {//...}public void callProcess() {process(this); // 将当前对象自身作为参数传递给 process 方法}
-
super 关键字:
super通常在子类中使用,用于访问父类(超类)的成员,包括属性、方法和构造器。- 在构造器中,
super()用于调用父类的构造器:class Child extends Parent {public Child() {super(); // 调用父类无参构造器}public Child(String name) {super(name); // 如果父类有一个接受 String 参数的构造器,则调用该构造器} } - 在子类的方法中,
super用于调用父类被覆盖(重写)的方法:class Animal {public void makeSound() {System.out.println("动物发出叫声");} }class Dog extends Animal {@Overridepublic void makeSound() {super.makeSound(); // 调用父类的 makeSound 方法System.out.println("狗叫汪汪汪");} } - 同样,
super也可以用于访问父类中被隐藏的静态字段。
相关文章:
【自学笔记】01Java基础-07面向对象基础-02继承
记录学习Java基础中有关继承、方法重写、构造器调用的基础知识,学习继承之前建议学习static关键字的内容【自学笔记】01Java基础-09Java关键字详解 1 继承概述 1.1 什么是继承? 1.2 继承的特点 子类可以继承父类的属性和行为,但是子类不能…...
二分查找(一)
算法原理 原理:当一个序列有“二段性”的时候,就可以使用二分查找算法。 适用范围:根据规律找一个点,能将这个数组分成两部分,根据规律能有选择性的舍去一部分,进而在另一个部分继续查找。 除了最普通的…...
【华为OD真题 Python】精准核酸检测
文章目录 题目描述输入描述输出描述示例1输入输出说明备注代码实现题目描述 为了达到新冠疫情精准防控的需要,为了避免全员核酸检测带来的浪费,需要精准圈定可能被感染的人群。 现在根据传染病流调以及大数据分析,得到了每个人之间在时间、空间上是否存在轨迹的交叉。 现…...
Springboot使用logback
文章目录 目录 文章目录 前言 一、添加依赖 二、使用步骤 三 、测试使用 总结 前言 Logback 是log4j 框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持 SLF4J。 Logback 的定制性更加灵活,同时也是 Sprin…...
【REST2SQL】03 GO读取JSON文件
REST2SQL需要一些配置信息,用JSON文件保存,比如config.json 1 创建config.json配置文件 {"hostPort":"localhost:5217","connString":"oracle://blma:5217127.0.0.1:1521/CQYH","_oracle":"ora…...
数据库-MySQL 启动方式
以管理员身份运行命令行 或者Shell net start //查看所有服务 net start MYSQL80 //启动服务 net stop MYSQL80 //停止服务完整安装MySQL社区版本的 会有这个 启动服务 停止服务 重启服务...
YAML使用
yaml yaml是类型aml,json的标记性语言,它强调以数据为中心 yaml的语法主要是如下几个: 大小写敏感 使用缩进表示层级关系 缩进不允许使用tab、只允许空格(低版本限制,高版本不限制) 缩进时空格数不重要&a…...
读书之深入理解ffmpeg_简单笔记2(初步)
再回看第一遍通读后的笔记,感觉还有很多的细节需要一一攻克,。 mp4的封装格式,解析方式。 flv的封装格式,解析方式。 ts的封装格式,解析方式。 第四章 封装和解封装 4.2 视频文件转flv (头文件和文件内容࿰…...
ELK+kafka+filebeat企业内部日志分析系统搭建
看上面的拓扑图,我们至少准备七台机器进行下面的实验项目。 机器主要作用分布如下: 三台安装elasticsearch来搭建ES集群实现高可用,其他机器就依次安装filebeat,kafka,logstash和kibana软件 一、部署elasticsearch来搭建ES集群 1.安装jdk 由于ES运行…...
勒索检测能力升级,亚信安全发布《勒索家族和勒索事件监控报告》
评论员简评 近期(12.08-12.14)共发生勒索事件119起,相较之前呈现持平趋势。 与上周相比,近期仍然流行的勒索家族为lockbit3和8base。在涉及的勒索家族中,活跃程度Top5的勒索家族分别是:lockbit3、siegedsec、dragonforce、8base和…...
编译原理复习的有用链接
2024年1月7日,考完编译原理,是时候和考试时候的她说再见了,整理一些收藏夹里的链接和思考吧 实验看这里: 编译原理_HNU岳麓山大小姐的博客-CSDN博客 课后习题看这里: 编译原理作业答案github LL1文法复习 [编译原…...
不带控制器打包exe,转pdf文件时失败的原因
加了注释的两条代码后,控制器会显示一个docx转pdf的进度条。这个进度条需要控制器的实现,如果转exe不带控制器的话,当点击转换为pdf的按钮就会导致程序出错和闪退。 __init__.py文件的入口...
Python 注释的方法
在Python中,有两种常见的注释方法: 单行注释:使用#符号来注释一行代码。在#符号后面的内容将被视为注释,不会被解释器执行,如: # 这是一个单行注释 print(hello world!) # 打印字符串多行注释࿱…...
webman插件创建
webman插件创建 介绍 应用插件实际上是一个完整的应用,它能以插件的形式安装到主项目中,使主项目快速获得某个模块功能。 例如:主项目需要一个问答系统,则可以安装一个问答应用插件,需要一个商城系统,则安…...
大模型迎来“AppStore时刻”,OpenAI给2024的新想象
一夜之间,OpenAI公布了多个重磅消息,引发市场关注。 钛媒体App 1月5日消息,今晨,OpenAI公司向所有GPT开发者们发布一封邮件称,下周将上线自定义的“GPT Store”商店,这有望推动ChatGPT开发者生态不断完善。…...
ubuntu解决在pycharm上使用jupyter无法导入虚拟环境中的包的问题
ubuntu解决在pycharm上使用jupyter无法导入虚拟环境中的包的问题 根本原因是jupyter 没有和他对应的kernel 需要先使用命令行建立kernel 下载ipykernel pip install ipykernel 首先激活conda conda activate然后添加你的kernel到虚拟环境 python -m ipykernel install -…...
探索2024年软件测试的几大主导趋势
进入2024年,考虑影响测试环境的问题至关重要。这种思考将成为团队了解主要瓶颈和实现当今不断提高的期望的首要因素。 01 了解关键测试瓶颈 毋庸置疑,现代团队需要不断创新、适应和拥抱最新趋势,以保持竞争力并提供以客户为中心的解决方案。尽…...
Linux C语言 48-信号总结
Linux C语言 48-信号总结 本节关键字:Linux、C语言、常用信号 相关C库函数:printf、signal、kill Linux中都有哪些信号 信号在Linux操作系统中是很重要的,信号的产生方式可以是来自键盘、由软件条件产生、调用硬件异常产生。来自系统函数调…...
【vue技巧】之如何让mixin的data 比本身vue的data优先级要高
GPT4.0国内站点:海鲸AI 在 Vue 中,当组件和 mixin 包含有冲突的选项时,这些选项将以一定的方式合并。对于 data 选项,组件自身的 data 会优先级更高,这意味着如果组件和 mixin 中出现了相同的字段,组件的数…...
全解析阿里云Alibaba Cloud Linux镜像操作系统
Alibaba Cloud Linux是基于龙蜥社区OpenAnolis龙蜥操作系统Anolis OS的阿里云发行版,针对阿里云服务器ECS做了大量深度优化,Alibaba Cloud Linux由阿里云官方免费提供长期支持和维护LTS,Alibaba Cloud Linux完全兼容CentOS/RHEL生态和操作方式…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
