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

【自学笔记】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 子类如何声明与父类同名的变量的两种方式

子类中想声明与父类同名的变量时有两种情况:

  1. 对于父类中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}
}
  1. 对于父类中非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 方法重写的注意事项

  1. 子类必须继承自父类。
  2. 重写方法的名称、形参列表、返回类型必须与被重写方法的一致。
  3. private私有方法和static静态方法不能被重写。
  4. 子类重写父类方法时,访问权限必须大于或者等于父类 (权限范围:缺省 < protected < public)
  5. 重写的方法抛出的异常类型不能大于父类对应方法允许抛出的异常类型,也就是说,子类重写的方法可以不抛出异常,或者抛出父类方法所声明异常的子类异常。

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编译器将不再自动提供无参构造器。这时若需无参构造器来创建对象,那么必须手动提供一个无参构造器,否则将会报错。

所以子类构造器调用父类有以下情况:

  1. 父类没有显式定义任何构造器,此时默认有无参构造器,子类会默认隐式调用父类无参构造器
  2. 父类显式定义了无参构造器,此时子类会默认隐式调用父类无参构造器。
  3. 父类显式定义了有参构造器,此时子类必须显式调用super(...)至少一个有参构造器,否则因为无法找到默认无参构造器报错。
  4. 父类显式定义了有参构造器和无参构造器,此时子类会默认隐式调用无参构造器,也可以显式调用任一构造器。

3.2 子类为什么必须调用父类构造器?

  1. 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。
  2. 子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化。

4 this和super关键字使用总结

在这里插入图片描述

  1. 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 方法}
      
  2. 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基础中有关继承、方法重写、构造器调用的基础知识&#xff0c;学习继承之前建议学习static关键字的内容【自学笔记】01Java基础-09Java关键字详解 1 继承概述 1.1 什么是继承&#xff1f; 1.2 继承的特点 子类可以继承父类的属性和行为&#xff0c;但是子类不能…...

二分查找(一)

算法原理 原理&#xff1a;当一个序列有“二段性”的时候&#xff0c;就可以使用二分查找算法。 适用范围&#xff1a;根据规律找一个点&#xff0c;能将这个数组分成两部分&#xff0c;根据规律能有选择性的舍去一部分&#xff0c;进而在另一个部分继续查找。 除了最普通的…...

【华为OD真题 Python】精准核酸检测

文章目录 题目描述输入描述输出描述示例1输入输出说明备注代码实现题目描述 为了达到新冠疫情精准防控的需要,为了避免全员核酸检测带来的浪费,需要精准圈定可能被感染的人群。 现在根据传染病流调以及大数据分析,得到了每个人之间在时间、空间上是否存在轨迹的交叉。 现…...

Springboot使用logback

文章目录 目录 文章目录 前言 一、添加依赖 二、使用步骤 三 、测试使用 总结 前言 Logback 是log4j 框架的作者开发的新一代日志框架&#xff0c;它效率更高、能够适应诸多的运行环境&#xff0c;同时天然支持 SLF4J。 Logback 的定制性更加灵活&#xff0c;同时也是 Sprin…...

【REST2SQL】03 GO读取JSON文件

REST2SQL需要一些配置信息&#xff0c;用JSON文件保存&#xff0c;比如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&#xff0c;json的标记性语言&#xff0c;它强调以数据为中心 yaml的语法主要是如下几个&#xff1a; 大小写敏感 使用缩进表示层级关系 缩进不允许使用tab、只允许空格&#xff08;低版本限制&#xff0c;高版本不限制&#xff09; 缩进时空格数不重要&a…...

读书之深入理解ffmpeg_简单笔记2(初步)

再回看第一遍通读后的笔记&#xff0c;感觉还有很多的细节需要一一攻克,。 mp4的封装格式&#xff0c;解析方式。 flv的封装格式&#xff0c;解析方式。 ts的封装格式&#xff0c;解析方式。 第四章 封装和解封装 4.2 视频文件转flv &#xff08;头文件和文件内容&#xff0…...

ELK+kafka+filebeat企业内部日志分析系统搭建

看上面的拓扑图&#xff0c;我们至少准备七台机器进行下面的实验项目。 机器主要作用分布如下: 三台安装elasticsearch来搭建ES集群实现高可用&#xff0c;其他机器就依次安装filebeat,kafka,logstash和kibana软件 一、部署elasticsearch来搭建ES集群 1.安装jdk 由于ES运行…...

勒索检测能力升级,亚信安全发布《勒索家族和勒索事件监控报告》

评论员简评 近期(12.08-12.14)共发生勒索事件119起&#xff0c;相较之前呈现持平趋势。 与上周相比&#xff0c;近期仍然流行的勒索家族为lockbit3和8base。在涉及的勒索家族中&#xff0c;活跃程度Top5的勒索家族分别是&#xff1a;lockbit3、siegedsec、dragonforce、8base和…...

编译原理复习的有用链接

2024年1月7日&#xff0c;考完编译原理&#xff0c;是时候和考试时候的她说再见了&#xff0c;整理一些收藏夹里的链接和思考吧 实验看这里&#xff1a; 编译原理_HNU岳麓山大小姐的博客-CSDN博客 课后习题看这里&#xff1a; 编译原理作业答案github LL1文法复习 [编译原…...

不带控制器打包exe,转pdf文件时失败的原因

加了注释的两条代码后&#xff0c;控制器会显示一个docx转pdf的进度条。这个进度条需要控制器的实现&#xff0c;如果转exe不带控制器的话&#xff0c;当点击转换为pdf的按钮就会导致程序出错和闪退。 __init__.py文件的入口...

Python 注释的方法

在Python中&#xff0c;有两种常见的注释方法&#xff1a; 单行注释&#xff1a;使用#符号来注释一行代码。在#符号后面的内容将被视为注释&#xff0c;不会被解释器执行&#xff0c;如&#xff1a; # 这是一个单行注释 print(hello world!) # 打印字符串多行注释&#xff1…...

webman插件创建

webman插件创建 介绍 应用插件实际上是一个完整的应用&#xff0c;它能以插件的形式安装到主项目中&#xff0c;使主项目快速获得某个模块功能。 例如&#xff1a;主项目需要一个问答系统&#xff0c;则可以安装一个问答应用插件&#xff0c;需要一个商城系统&#xff0c;则安…...

大模型迎来“AppStore时刻”,OpenAI给2024的新想象

一夜之间&#xff0c;OpenAI公布了多个重磅消息&#xff0c;引发市场关注。 钛媒体App 1月5日消息&#xff0c;今晨&#xff0c;OpenAI公司向所有GPT开发者们发布一封邮件称&#xff0c;下周将上线自定义的“GPT Store”商店&#xff0c;这有望推动ChatGPT开发者生态不断完善。…...

ubuntu解决在pycharm上使用jupyter无法导入虚拟环境中的包的问题

ubuntu解决在pycharm上使用jupyter无法导入虚拟环境中的包的问题 根本原因是jupyter 没有和他对应的kernel 需要先使用命令行建立kernel 下载ipykernel pip install ipykernel 首先激活conda conda activate然后添加你的kernel到虚拟环境 python -m ipykernel install -…...

探索2024年软件测试的几大主导趋势

进入2024年&#xff0c;考虑影响测试环境的问题至关重要。这种思考将成为团队了解主要瓶颈和实现当今不断提高的期望的首要因素。 01 了解关键测试瓶颈 毋庸置疑&#xff0c;现代团队需要不断创新、适应和拥抱最新趋势&#xff0c;以保持竞争力并提供以客户为中心的解决方案。尽…...

Linux C语言 48-信号总结

Linux C语言 48-信号总结 本节关键字&#xff1a;Linux、C语言、常用信号 相关C库函数&#xff1a;printf、signal、kill Linux中都有哪些信号 信号在Linux操作系统中是很重要的&#xff0c;信号的产生方式可以是来自键盘、由软件条件产生、调用硬件异常产生。来自系统函数调…...

【vue技巧】之如何让mixin的data 比本身vue的data优先级要高

GPT4.0国内站点&#xff1a;海鲸AI 在 Vue 中&#xff0c;当组件和 mixin 包含有冲突的选项时&#xff0c;这些选项将以一定的方式合并。对于 data 选项&#xff0c;组件自身的 data 会优先级更高&#xff0c;这意味着如果组件和 mixin 中出现了相同的字段&#xff0c;组件的数…...

全解析阿里云Alibaba Cloud Linux镜像操作系统

Alibaba Cloud Linux是基于龙蜥社区OpenAnolis龙蜥操作系统Anolis OS的阿里云发行版&#xff0c;针对阿里云服务器ECS做了大量深度优化&#xff0c;Alibaba Cloud Linux由阿里云官方免费提供长期支持和维护LTS&#xff0c;Alibaba Cloud Linux完全兼容CentOS/RHEL生态和操作方式…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

二维FDTD算法仿真

二维FDTD算法仿真&#xff0c;并带完全匹配层&#xff0c;输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类&#xff0c;将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix&#xff0c;将上述三个类翻入其中&#xff0c;通过它管理每个音乐…...

多模态大语言模型arxiv论文略读(112)

Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文标题&#xff1a;Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文作者&#xff1a;Jea…...

TI德州仪器TPS3103K33DBVR低功耗电压监控器IC电源管理芯片详细解析

1. 基本介绍 TPS3103K33DBVR 是 德州仪器&#xff08;Texas Instruments, TI&#xff09; 推出的一款 低功耗电压监控器&#xff08;Supervisor IC&#xff09;&#xff0c;属于 电源管理芯片&#xff08;PMIC&#xff09; 类别&#xff0c;主要用于 系统复位和电压监测。 2. …...

Modbus转ETHERNET IP网关:快速冷却系统的智能化升级密钥

现代工业自动化系统中&#xff0c;无锡耐特森Modbus转Ethernet IP网关MCN-EN3001扮演着至关重要的角色。通过这一技术&#xff0c;传统的串行通讯协议Modbus得以在更高速、更稳定的以太网环境中运行&#xff0c;为快速冷却系统等关键设施的自动化控制提供了强有力的支撑。快速冷…...

豆瓣图书评论数据分析与可视化

【题目描述】豆瓣图书评论数据爬取。以《平凡的世界》、《都挺好》等为分析对象&#xff0c;编写程序爬取豆瓣读书上针对该图书的短评信息&#xff0c;要求&#xff1a; &#xff08;1&#xff09;对前3页短评信息进行跨页连续爬取&#xff1b; &#xff08;2&#xff09;爬取…...