一文详解:Java中,父子类静态块、构造块、构造方法、成员变量之间的初始化先后顺序与执行先后顺序

本文主要是介绍一文详解:Java中,父子类静态块、构造块、构造方法、成员变量之间的初始化先后顺序与执行先后顺序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、各个块之间的执行顺序


父类静态代码块--->子类静态代码块
--->父类构造代码块--->父类构造方法
--->子类构造代码块--->子类构造方法


2、各个模块之间的加载顺序


加载顺序与执行顺序不同,这里指的是JVM加载类中的组成部分

父类静态成员变量/静态代码块/静态成员方法--->子类静态成员变量/静态代码块/静态成员方法
--->父类普通成员变量/普通成员方法--->父类构造代码块--->父类构造方法
--->子类普通成员变量/普通成员方法--->子类构造代码块--->子类构造方法


注意:

静态成员变量、静态成员方法与静态代码块属于同一级别加载,根据代码书写的先后顺序,决定谁先加载。

静态代码块若使用了某个静态成员变量,那么该静态成员变量一定比静态代码块先加载。

下面为该顺序的详细解释

3、释义

  • 在Java中,由花括号"{ }"包裹的范围,称为块

静态代码块

  • 最外层由static引领的块"{}",称为静态代码块,

    特点:在类加载时(可以理解为程序启动时),自动执行一次,之后不会再执行

如:

public class ParentCase {/** 静态代码块 */static {System.out.println("我是静态代码块");}
}

构造代码块

  • 在类中直接使用{}的块,称为构造代码块,又称为动态代理块或实例代码块

特点:每次创建对象(new)时,该块自动执行一次,用于初始化类中的配置,若该类没有创建对象,则构造代码块不会执行(而静态代码块在项目启动时,自动执行一次)

如:

public class ParentCase {/** 构造代码块 */{//用于初始化该类的配置,如每次创建不同对象时,加载公共配置System.out.println("我是构造代码块");}
}

构造方法


方法名称与类名相同,无返回类型且不能使用static修饰的方法,称为构造方法。

特点:

在该类实例化时,会执行指定的构造方法去创建对象。

构造方法在构造代码块后执行(与构造代码块的区别)。

每一个类都默认存在无参的构造方法,当手动声明构造方法时,无参的构造方法会消失。

如:

public class ParentCase {public ParentCase() {}
}

成员变量


直接声明在类中的变量。根据是否static修饰,分为"静态成员变量"与"普通成员变量(又称为实例成员变量)".

注意:

在类初始化时,遇到static模块(静态成员变量、静态代码块),会从上往下编译。

静态成员变量由static修饰,与静态代码块加载顺序是同一级别的,但是,若静态代码块中使用了某个成员变量,那么该成员变量必须声明在静态代码块之前(这时,静态成员变量比静态代码块先加载)

如:

3、案例

案例:

父类代码

如下:

public class ParentCase {static {System.out.println("父类静态代码块");}{System.out.println("父类构造代码块");}public ParentCase() {System.out.println("父类构造方法");}
}
子类代码

如下:

public class ChildrenCase extends ParentCase{static {System.out.println("子类静态代码块");}{System.out.println("子类构造代码块");}public ChildrenCase() {System.out.println("子类构造方法");}
}
测试代码

如下:

public static void main(String[] args) {/*** 创建子类对象,调用子类的成员方法test()* 测试各个块之间的执行顺序*/new ChildrenCase();
}

结果:

这篇关于一文详解:Java中,父子类静态块、构造块、构造方法、成员变量之间的初始化先后顺序与执行先后顺序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/477067

相关文章

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

详解nginx 中location和 proxy_pass的匹配规则

《详解nginx中location和proxy_pass的匹配规则》location是Nginx中用来匹配客户端请求URI的指令,决定如何处理特定路径的请求,它定义了请求的路由规则,后续的配置(如... 目录location 的作用语法示例:location /www.chinasem.cntestproxy

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.