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

【一步一步了解Java系列】:子类继承以及代码块的初始化

看到这句话的时候证明:此刻你我都在努力
加油陌生人
微信图片编辑_20240229212205.png
个人主页: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();}}

image.png
然后我们从上面的代码中也是发现子类能够使用父类的成员变量或给其赋值,也可以调用父类的成员方法

然后我们进入到第二个知识点:如果父类中包含构造方法时,子类要不要也定义一个构造方法,如何构造?那会不会与父类的构造方法冲突呢?我们接下来往下看:

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();}}

如上:我们这次在父类加上构造方法,那么我们就必须在子类里先完成父类的构造方法,否则编译器会报错
image.png
那么该如何正确的定义子类的构造方法呢?
那就是像上面的代码一样使用super关键字。
那么接下来我们就来了解一下super关键字。

super

super关键字,在我现学的阶段有两个作用

  1. 访问父类成员:当你在子类中重写了父类的方法或访问了父类的属性时,你可以使用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()");}
}
  1. 调用父类的构造方法:在子类的构造方法中,你可以使用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的对比

相同点:

  1. 都是Java中的关键字。
  2. 都只能在类的非静态方法里使用,用来访问类的非静态成员方法或成员变量。
  3. 他们都要放在方法的第一句,这就注定他们不能同时出现在一个方法里。

不同点:

  1. this关键字
    • this指的是当前对象的引用。
    • 它用于当前对象的方法或构造方法中,来引用当前对象的成员(属性、方法)。
    • this可以用来调用当前类的其他构造方法(使用this()语法)。
    • this可以用来区分成员变量和局部变量,当它们具有相同的名称时。

示例:

class Example {int value;Example(int value) {this.value = value; // 使用this来引用当前对象的成员变量}void setValue(int value) {this.value = value; // 使用this来明确区分成员变量和参数}
}
  1. 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关键字了,我们来看一下这段代码:

image.png
中间的static的花括号里的就是静态代码块。


实例代码块
image.png
这样一个单独的花括号,或者没有花括号都算是实例代码块。


然后构造方法大家都是知道的。

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();}}

image.png
如上我们得出结论:在一个类中我们的初始化顺序是: 静态代码块---->实例代码块---->构造方法

那么我们又联想到,子类在实例化的时候会先实现父类的构造方法,那么如果在子类中实例化的顺序又是怎样呢?

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();}}

image.png
又如上面代码又得出一个结论:
子类的初始化顺序为:父类静态代码块---->子类的静态代码块---->父类的实例代码块---->父类的构造方法
---->子类的实例代码块---->子类的构造方法

文章已到末尾,喜欢的话可以点个赞哦!

相关文章:

【一步一步了解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 本文最终目的是编写一个按键拍照的例程序: 为以后的专用场景的模型训练做准备&#xf…...

如何定义“智慧校园”这个概念

在信息爆炸的时代,教育面临着前所未有的挑战:如何让每个学生在海量知识中找到属于自己的路径?如何让教师的智慧与科技的力量相得益彰?如何让校园成为培养创新思维的摇篮?智慧校园,这一概念的提出&#xff0…...

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.问题现象 激活之后在使用过程中有时候会出现密钥被撤销的警告,而且该工具无法使用&#xff…...

知识见闻 - 人和动物的主要区别

人类和动物的主要区别之一确实在于理性,但这只是众多区别中的一个方面。以下是一些更全面的比较,突出人类和动物之间的主要区别: 理性和抽象思维: 人类:人类具有高度发展的理性能力,可以进行抽象思维、逻辑…...

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的软件包管理器&#xff0…...

pytest +allure在测试中的应用

一、allure配置: 1、安装allure库 pip install allure-pytest2、代码中导入 import allure3、常用命令: 1)、 pytest --alluredir报告目录 测试脚本.py比如:pytest --alluredir./allure_report (未指定执行所有) 2&…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

SpringCloudGateway 自定义局部过滤器

场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

Kafka主题运维全指南:从基础配置到故障处理

#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...