当前位置: 首页 > 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生态和操作方式…...

什么是数据结构?

1、一种非常经典的数据结构。 栈数据结构&#xff1a;stack 2、什么是数据结构&#xff1f; 数据结构通常是&#xff1a;存储数据的容器。而该容器可能存在不同的结构。 数据结构和 java 语言实际上是没有关系&#xff0c;数据结构是一门独立的学科。 在大学计算机专业中&#…...

GOOS=darwin 代表macOS环境

GOOSdarwin 是一个环境变量设置&#xff0c;表示目标操作系统为 macOS。 在Go语言中&#xff0c;可以使用环境变量 GOOS 来指定目标操作系统&#xff0c;用于交叉编译或跨平台开发。darwin 是指苹果公司的操作系统系列&#xff0c;主要是 macOS。 通过设置 GOOSdarwin&#x…...

hfish蜜罐docker部署

centos 安装 docker-CSDN博客Docker下载部署 Docker是我们推荐的部署方式之一&#xff0c;当前的版本拥有以下特性&#xff1a; 自动升级&#xff1a;每小时请求最新镜像进行升级&#xff0c;升级不会丢失数据。数据持久化&#xff1a;在宿主机/usr/share/hfish目录下建立dat…...

我的创作纪念日——redis的历史纪录

机缘 最开始只想存留点Redis的操作信息&#xff0c;后来写着写着也就写多了&#xff0c;虽然后面很长时间由于忙就没继续写&#xff0c;但是还是偶尔登录看一下&#xff0c;有好几篇文章的浏览量还是很多的呢。 收获 收获不多&#xff0c;粉丝也才三十多个&#xff0c;浏览量感…...

【Bootstrap5学习 day10】

Flex布局 弹性盒子是CSS3的一种新的布局模式&#xff0c;更适合响应式的设计 创建一个弹性盒子容器 使用d-flex类&#xff0c;创建flexbox容器并将直接子项转换为flex项 <div class"d-flex p-3 bg-info text-white"><div class"p-2 bg-secondary"…...

2024年学习计划

2024-2-29号完成 机器视觉基础知识学习&#xff0c;并可以处理视觉工作中的需求。 2024-3月份学习SCARA机械手应用开发SCARA机器人-埃斯顿自动化 - ESTUN 2024-4月份继续学习python 好了&#xff0c;今年可以完成这三个目标就满足了 好好学习&#xff0c;天天向上。每天进步…...

学习笔记:C++之 switch语句

Switch语句 作用&#xff1a;执行多条件分支语句 语法&#xff1a; switch&#xff08;表达式&#xff09;{ case 结果1&#xff1a;执行语句&#xff1b;break&#xff1b; case 结果2&#xff1a;执行语句&#xff1b;break&#xff1b; ... default&#xff1a;执行语句&a…...

C++ 具名要求-全库范围的概念

此页面中列出的具名要求&#xff0c;是 C 标准的规范性文本中使用的具名要求&#xff0c;用于定义标准库的期待。 某些具名要求在 C20 中正在以概念语言特性进行形式化。在那之前&#xff0c;确保以满足这些要求的模板实参实例化标准库模板是程序员的重担。若不这么做&#xf…...

分布式(4)

目录 16.分布式缓存可能会存在哪些问题&#xff1f; 17.分布式限流了解过吗&#xff1f; 18.分布式定时任务怎么实现&#xff1f; 19.什么是分布式系统的副本一致性&#xff1f;有哪些&#xff1f; 20.在分布式系统中有哪些常见的一致性算法&#xff1f; 21.谈谈你对一致性…...

XCTF-Misc1 USB键盘流量分析

m0_01 附件是一个USB流量文件 分析 1.键盘流量 USB协议数据部分在Leftover Capture Data域中&#xff0c;数据长度为八个字节&#xff0c;其中键盘击健信息集中在第三个字节中。 usb keyboard映射表&#xff1a;USB协议中HID设备描述符以及键盘按键值对应编码表 2.USB…...

做qq阅读网站介绍/线下推广的渠道和方法

空间域与变换域空间域处理方法&#xff1a;根据图像像元数据的空间表示f(x, y)进行处理变换域处理方法&#xff1a;对像元数据的空间表示f(x, y)进行某种变换&#xff0c;针对变换数据进行处理数字图像空间域处理方法数值运算&#xff1a;单波段点运算点运算&#xff1a;对单幅…...

万网 速成网站/seo优化公司如何做

有时提交后能显示刚才插入的数据有时提交后显示不出来刚才插入的数据 等再插入一条时就把刚才没有显示的一块都显示出来了 我试了很多次 没有什么规律 这是什么原因呢 ajax的缓存还是什么&#xff1f;怎么解决呢&#xff1f;提交页面prepare("select id,txt from ajax&quo…...

pdfzz.wordpress.com/cilimao磁力猫最新版地址

laravel-admin的框架已经定义好的多级联动可以去官网查看&#xff0c;这里就不再进行赘述&#xff0c;但是使用中发现功能与想要的东西有些偏差&#xff0c;刚进来默认的时候不好用&#xff0c;就自己改了改&#xff0c;增加了一个默认的方法。以城市和地区的二级联动为例&…...

淘客网站怎么建设/性能优化大师

引论 &#xff1a; Java没有c的“条件编译&#xff08;conditional compilation&#xff09;”功能&#xff0c;该功能可以使你不必更改任何程序代码&#xff0c;就能够切换开关并产生不同的行为。java去掉此功能的原因可能是因为c在绝大多数情况下是用此功能来解决跨平台问题的…...

微信小程序设计网站/企业营销型网站策划

上次我们讨论了静态的NAT&#xff0c;发现静态NAT并不能起到节约IP地址的作用&#xff0c;那么静态NAT存在的意义是什么呢&#xff1f; 我们看下面的拓扑 公司的一个员工&#xff0c;要在家里面来访问公司内部的资源&#xff0c;那么想实现这个目的&#xff0c;通过***我们可以…...

海外购物网站上填手机号码怎么做/特大新闻凌晨刚刚发生

2019独角兽企业重金招聘Python工程师标准>>> Table of Contents 1 游戏中必不可少的 UI 元素 2 使用 CocoStudio UI 编辑器设计配置界面 2.1 首先建立主配置界面&#xff1a; 2.2 其次我们需要一个 “修改密码” 的二级 UI 界面&#xff1a; 3 编写代码控制页面逻辑…...