【一步一步了解Java系列】:子类继承以及代码块的初始化
看到这句话的时候证明:此刻你我都在努力
加油陌生人
个人主页:Gu Gu Study
专栏:一步一步了解Java
喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹
喜欢的话可以点个赞谢谢了。
作者:小闭
继承的概念以及继承存在的意义
Java中的继承是一种面向对象编程(OOP)的基本概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。继承提供了一种机制,使得子类可以扩展或修改父类的行为。
意义:
首先,继承是面向对象编程的核心特性之一,它体现了面向对象设计的原则,如封装、抽象、继承和多态。其次继承可以提高代码的复用率,让子类继承运用到父类的一些数据和方法。还可以实现多态,使一个接口呈现不同的功能实现。还有实现程序的扩展性可以在一个代码的基础上进行扩展等等功能。当然继承还有好多意义,这里使列举不完的。
子类继承
讲到继承我们首先还是先了解子类,那么子类和父类如何分辨,还有如何继承,接下来都会讲到,我们先看一下下面的代码:
在这段代码中Animal为父类,Dog是子类,首先我们在生活中的逻辑上就是狗一定是动物,而动物不一定是狗,这就说明动物的范围更大,所以Animal是父类,Dog是子类。然后再从语法上分析,首先我们看到extends这个关键字,那么这个就代表继承,那么我们看到一个类使用了这个关键字就说明它就是这个关键字后面那个类的子类,extends后面的就是父类。比如: ** class Dog extends Animal{}**,那么Dog就为子类,Animal就是父类。
public class Animal {String type;int age;public void eat(){System.out.println("吃食物");}public void speak(){System.out.println("发出叫声");}}class Dog extends Animal{String name;public Dog(String name){type="狗";this.name=name;System.out.println("他是一只"+type+" 它的名字为:"+name);}public static void main(String[] args) {Dog dog=new Dog("旺财");dog.speak();dog.eat();}}
然后我们从上面的代码中也是发现子类能够使用父类的成员变量或给其赋值,也可以调用父类的成员方法。
然后我们进入到第二个知识点:如果父类中包含构造方法时,子类要不要也定义一个构造方法,如何构造?那会不会与父类的构造方法冲突呢?我们接下来往下看:
public class Animal {String type;int age;
public Animal(String type,int age){this.type=type;this.age=age;}public void eat(){System.out.println("吃食物");}public void speak(){System.out.println("发出叫声");}}class Dog extends Animal{String name;public Dog(String type, int age, String name) {super(type, age);this.name = name;}public static void main(String[] args) {Dog dog=new Dog("狗",2,"旺财");System.out.println("他是一只"+dog.type+" 它的名字为:"+dog.name);dog.speak();dog.eat();}}
如上:我们这次在父类加上构造方法,那么我们就必须在子类里先完成父类的构造方法,否则编译器会报错
那么该如何正确的定义子类的构造方法呢?
那就是像上面的代码一样使用super关键字。
那么接下来我们就来了解一下super关键字。
super
super关键字,在我现学的阶段有两个作用
- 访问父类成员:当你在子类中重写了父类的方法或访问了父类的属性时,你可以使用super来明确地调用父类中的版本。例如:
复制
class Parent {void show() {System.out.println("Parent's show()");}
}class Child extends Parent {void show() {super.show(); // 调用父类的show()方法System.out.println("Child's show()");}
}
- 调用父类的构造方法:在子类的构造方法中,你可以使用super()来调用父类的构造方法。这通常在构造方法的第一行进行,以确保在子类对象的初始化过程中,父类的状态也被正确地初始化。
class Parent {Parent() {System.out.println("Parent's constructor");}
}class Child extends Parent {Child() {super(); // 调用父类的构造方法System.out.println("Child's constructor");}
}
第二点就是我所说的可以调用父类构造方法,注意super的调用必须在第一位。
然后现在回过头来是不是就发现上面的代码就可以理解了
super和this的对比
相同点:
- 都是Java中的关键字。
- 都只能在类的非静态方法里使用,用来访问类的非静态成员方法或成员变量。
- 他们都要放在方法的第一句,这就注定他们不能同时出现在一个方法里。
不同点:
- this关键字:
- this指的是当前对象的引用。
- 它用于当前对象的方法或构造方法中,来引用当前对象的成员(属性、方法)。
- this可以用来调用当前类的其他构造方法(使用this()语法)。
- this可以用来区分成员变量和局部变量,当它们具有相同的名称时。
示例:
class Example {int value;Example(int value) {this.value = value; // 使用this来引用当前对象的成员变量}void setValue(int value) {this.value = value; // 使用this来明确区分成员变量和参数}
}
- super关键字:
- super指的是当前对象的直接父类对象的引用。
- 它用于访问父类的成员,特别是当子类重写了父类的方法或变量时。
- super用于调用父类的构造方法(使用super()语法)。
- super可以用来引用父类的类型,这在泛型和继承中特别有用。
示例:
class Parent {void show() {System.out.println("Parent's show()");}
}class Child extends Parent {void show() {super.show(); // 调用父类的方法}Child() {super(); // 调用父类的构造方法}
}
总结区别:
- this是指向当前对象的引用。
- super是指向当前对象的父类对象的引用。
- this用于引用当前类的成员或调用其他构造方法。
- super用于引用父类的成员或调用父类的构造方法。
- this通常用于当前类的作用域内。
- super通常用于子类中,与父类交互。
代码块的初始化与构造方法实现的先后顺序
那么现在我们了解一下代码块。代码块分为静态代码块和示例代码块,总所周知代码块和构造方法都可以给对象的成员赋值,那么他们赋值的顺序我们真的了解吗?接下来我们就可以来探索一下。
静态代码块
说到静态那么我们肯定要有static关键字了,我们来看一下这段代码:
中间的static的花括号里的就是静态代码块。
实例代码块
这样一个单独的花括号,或者没有花括号都算是实例代码块。
然后构造方法大家都是知道的。
public Test(){System.out.println("执行了构造方法");}
那么他们执行的顺序是什么呢?我们继续往下看代码:
public class Test {String name="haha";int age=18;static{System.out.println("执行了静态代码块");}public Test(){System.out.println("执行了构造方法");}{System.out.println("执行了实例代码块");}}class Main{public static void main(String[] args) {Test test=new Test();}}
如上我们得出结论:在一个类中我们的初始化顺序是: 静态代码块---->实例代码块---->构造方法。
那么我们又联想到,子类在实例化的时候会先实现父类的构造方法,那么如果在子类中实例化的顺序又是怎样呢?
public class Test {String name="haha";int age=18;static{System.out.println("执行了父类的静态代码块");}public Test(){System.out.println("执行了父类的构造方法");}{System.out.println("执行了父类实例代码块");}}class Test1 extends Test{String type="狗";static{System.out.println("执行了子类的静态代码块");
}public Test1(){System.out.println("执行了子类的构造方法");}{System.out.println("执行了子类的实例代码块");}}class Main{public static void main(String[] args) {Test test1=new Test1();}}
又如上面代码又得出一个结论:
子类的初始化顺序为:父类静态代码块---->子类的静态代码块---->父类的实例代码块---->父类的构造方法
---->子类的实例代码块---->子类的构造方法
文章已到末尾,喜欢的话可以点个赞哦!
相关文章:

【一步一步了解Java系列】:子类继承以及代码块的初始化
看到这句话的时候证明:此刻你我都在努力 加油陌生人 个人主页:Gu Gu Study专栏:一步一步了解Java 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者:小闭 …...
探索Expect Python用法:深入解析与实战挑战
探索Expect Python用法:深入解析与实战挑战 在自动化和脚本编写领域,Expect Python已经成为了一种强大的工具组合。它结合了Expect的交互式会话处理能力和Python的编程灵活性,为开发者提供了一种全新的方式来处理复杂的自动化任务。然而&…...

【PostgreSQL17新特性之-explain命令新增选项】
EXPLAIN是一个用于显示语句执行计划的命令,可用于显示以下语句类型之一的执行计划: - SELECT - INSERT - UPDATE - DELETE - VALUES - EXECUTE - DECLARE - CREATE TABLE AS - CREATE MATERIALIZED VIEWPostgreSQL17-beta1版本近日发布了,新…...

JAVA实现人工智能,采用框架SpringAI
文章目录 JAVA实现人工智能,采用框架SpringAISpring AI介绍使用介绍项目前提项目结构第一种方式采用openai1. pom文件: 2. application.yml 配置3.controller 实现层 项目测试 JAVA实现人工智能,采用框架SpringAI Spring AI介绍 Spring AI是AI工程师的一个应用框架…...

基础—SQL—DQL(数据查询语言)分组查询
一、引言 分组查询的关键字是:GROUP BY。 二、DQL—分组查询 1、语法 SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后过滤条件 ]; 注意: 1、[ ] 里的内容可以有可以没有。 2、这条SQL语句有两块指定条件的地方&#…...

从CSV到数据库(简易)
需求:客户上传CSV文档,要求CSV文档内容查重/插入/更新相关数据。 框架:jdbcTemplate、commons-io、 DB:oracle 相关依赖: 这里本来打算用的2.11.0,无奈正式项目那边用老版本1.3.1,新版本对类型…...

K210视觉识别模块学习笔记3:内存卡写入拍摄图片_LED三色灯的操作_按键操作_定时器的配置使用
今日开始学习K210视觉识别模块: LED三色灯的操作_按键操作_定时器的配置使用_内存卡写入拍摄图片 亚博智能的K210视觉识别模块...... 固件库版本: canmv_yahboom_v2.1.1.bin 本文最终目的是编写一个按键拍照的例程序: 为以后的专用场景的模型训练做准备…...

如何定义“智慧校园”这个概念
在信息爆炸的时代,教育面临着前所未有的挑战:如何让每个学生在海量知识中找到属于自己的路径?如何让教师的智慧与科技的力量相得益彰?如何让校园成为培养创新思维的摇篮?智慧校园,这一概念的提出࿰…...
OpenSSL自签名证书
文章目录 生成1. 生成根证书的私钥(root_private_key.pem)2. 创建根证书的CSR和自签名证书(root_csr.pem)3. 生成服务器证书的私钥(server_private_key.pem)4. 创建服务器证书的CSR(server_priv…...

QtCreator调试运行工程报错,无法找到相关库的的解决方案
最新在使用国产化平台做qt应用开发时,总是遇到qtcreator内调试运行 找不到动态库的问题,为什么会出现这种问题呢?明明编译的时候能够正常通过,运行或者调试的时候找不到相关的库呢?先说结论,排除库本身的问…...

【Python系列】Python 元组(Tuple)详解
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
特征融合篇 | YOLOv8 引入动态上采样模块 | 超过了其他上采样器
1. 介绍 本篇介绍了一种将动态上采样模块引入 YOLOv8 目标检测算法的新方法,该方法在 COCO 数据集上获得了 55.7% 的 mAP,超越了其他上采样器。该方法将动态上采样模块引入到 YOLOv8 的特征融合阶段,能够根据输入图像的特征分辨率动态调整上…...

Beyond Compare 3密钥被撤销的解决办法
首先,BCompare3的链接如下 链接:https://pan.baidu.com/s/1vuSxY0cVQCt0-8CpFzUhvg 提取码:8888 --来自百度网盘超级会员V7的分享 1.问题现象 激活之后在使用过程中有时候会出现密钥被撤销的警告,而且该工具无法使用ÿ…...
知识见闻 - 人和动物的主要区别
人类和动物的主要区别之一确实在于理性,但这只是众多区别中的一个方面。以下是一些更全面的比较,突出人类和动物之间的主要区别: 理性和抽象思维: 人类:人类具有高度发展的理性能力,可以进行抽象思维、逻辑…...

Javaweb基础之工程路径
大家好,这里是教授.F 引入: 工程路径有一个知识点需要注意:就是相对路径。所谓相对路径就是依赖当前位置: 相对路径的定位依赖于当前位置或参考位置。 使用相对路径来解决, 一个非常重要的规则:页面所有的…...

国际荐酒师(香港)协会受邀出席广州意大利国庆晚宴
2024年5月30日,意大利驻广州总领事馆举办的2024年意大利国庆招待会及晚宴,庆祝意大利共和国成立。此次晚宴旨在促进中意两国之间的文化交流与合作。国际荐酒师(香港)协会受主办方邀请参与了这一重要活动。 国际荐酒师(…...

让驰骋BPM系统插上AI的翅膀
让驰骋BPM系统插上AI的翅膀 在当今日益复杂多变的商业环境中,业务流程管理(BPM)系统的应用愈发广泛,成为企业提高效率、优化流程、降低成本的重要工具。驰骋BPM系统凭借其出色的性能和丰富的功能,赢得了众多企业的青睐…...
排队论 | 基于排队机制实现智能仓储机器人巡逻及避碰
研究背景: 智能仓储机器人在现代物流行业中扮演着重要的角色,能够提高仓库的运作效率和准确性。然而,仓储机器人在巡逻过程中可能会遇到其他机器人或障碍物,这就需要解决排队和避碰问题,以确保安全和高效的运作。 研究路线: 背景调研:了解智能仓储机器人的发展和应用…...

Node.js和npm常用命令
一、Node.js简介 Node.js是一个免费、开源、跨平台的JavaScript运行时环境,允许开发人员创建服务器、web应用程序、命令行工具和脚本。 点击查看node.js中文官网 点击查看node.js英文官网 二、npm简介 npm(Node Package Manager)是Node.js的软件包管理器࿰…...
pytest +allure在测试中的应用
一、allure配置: 1、安装allure库 pip install allure-pytest2、代码中导入 import allure3、常用命令: 1)、 pytest --alluredir报告目录 测试脚本.py比如:pytest --alluredir./allure_report (未指定执行所有) 2&…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...