静态代码块、构造代码块以及构造函数的加载顺序
介绍具体的例子
Parent类:
- public class Parent {
- public Parent() {
- System.out.println("这是父类的构造方法");
- }
- public void d_Parent() {
- System.out.println("这是父类的非静态方法");
- }
- public static void s_Parent() {
- System.out.println("这是父类的静态方法");
- }
- static {
- System.out.println("这是父类的静态代码快");
- }
- {
- System.out.println("这是父类的构造代码快");
- }
- }
Child类:
- public class Child extends Parent{
- public Child() {
- System.out.println("这是子类的构造方法");
- }
- public static void s_Child() {
- System.out.println("这是子类的静态方法");
- }
- public void d_Child() {
- System.out.println("这是子类的非静态方法");
- }
- static{
- System.out.println("这是子类的静态代码块");
- }
- {
- System.out.println("这是子类的构造代码块");
- }
- public static void main(String[] args) {
- System.out.println("before new Child()");
- new Child();
- }
- }
输出结果:
- 这是父类的静态代码块
- 这是子类的静态代码块
- before new Child()
- 这是父类的构造代码块
- 这是父类的构造方法
- 这是子类的构造代码块
- 这是子类的构造方法
结论:
首先,静态代码块,构造代码块,和构造函数都存在于一个类中,只不过,他们执行的先后顺序和执行的次数不同。
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次。
构造代码块:类中直接用{}定义,每一次创建对象时执行。
构造函数:构造函数的命名必须和类名完全相同,它没有返回值,也不能用void来修饰。
执行顺序优先级:静态块>main()>构造块>构造方法。
JVM分析
一、JVM加载类文件
将类文件中的一行行内容全部加载到内存中(除了实例变量,因为这是对象私有的),但不执行任何语句,即使在加载时期有输出语句也不执行。加载的时候,将静态成员变量(类变量),构造代码块,静态代码块以及静态方法加载到方法区的静态部分,非静态方法以及构造方法加载到方法区的非静态部分。
二、执行代码块
类文件加载好以后,开始执行静态代码块,然后在堆内存中开辟空间,分配内存地址。
接着开始在堆内存中对实例变量进行默认初始化,
然后执行构造代码块,对object进行对应的构造代码块的初始化,
最后进行构造函数的初始化,对object进行对应的构造函数初始化。
作用分析
静态代码块用于给类初始化,类加载的时候就会被执行;
构造代码块用于给对应对象初始化,只要创建对象就会被执行,而且执行的顺序优先于构造函数;
构造函数用于给对应对象初始化,只要创建对象,就会选择相应的构造函数进行初始化。
总结:静态代码块是最先执行的,然后执行父类的构造代码块以及父类的构造方法,接着去执行子类的非静态代码块以及子类的构造方法。
顺序为:初始化父类静态代码块->初始化子类静态代码块->初始化父类构造代码块->初始化父类构造方法->初始化子类构造代码块->初始化子类构造方法
根据输出结果,"before new Child()"是在是在执行完静态代码块以后然后才输出的,这就证明静态代码块是不需要创建对象就可以执行的,只要加载完类文件就可以执行,而构造代码块以及构造方法是在执行创建对象的时候才进行初始化的。
那么,什么时候才会加载类文件呢?
1.执行new Child() 操作的时候;
2.使用类中的静态成员变量或者静态方法的时候;
3.在命令行中执行:java Child的时候。
静态代码块、构造代码块以及构造函数的加载顺序相关推荐
- Java中构造函数,静态代码块,构造代码块的执行顺序
静态代码块:用static声明,jvm加载类的时候执行,只执行一次. 构造代码块:由{}定义,每一次创建对象的时候执行. 构造函数:对象一建立就调用相应的构造函数. 静态代码块 1.它是随着类的加载而 ...
- [转载] Java静态代码块/构造代码块/构造函数/静态变量/成员变量(相关示例)
参考链接: Java程序的输出| 构造函数 近期做牛客网的Java开发笔试题,发现这类型的题目较多,很容易混淆,特将相关概念和相关示例整理如下,供大家参考^_^ 1. 静态代码块在类加载时即运行,而且 ...
- 静态代码块 构造代码块 构造方法的执行顺序
今天我总结了一下java中静态代码块 构造代码块 构造方法的执行顺序及其注意问题 执行顺序: 静态代码块>构造代码块>构造方法体 首先要知道静态代码块是随着类的加载而加载,而构造代码块和构 ...
- java静态代码块、静态方法、静态变量、构造代码块、普通代码块、成员变量执行顺序
package smartt.styy.auth.model.voRsp;public class Test {static {String test5="555";//局部变量t ...
- java中静态变量,静态代码块,静态方法,实例变量,匿名代码块的加载顺序
1. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块 在Java中,使用{}括起来的代码称为代码块,代码块可以分为以下四种: (1)普通代码块:就是类中方法的方法体 public vo ...
- 类的加载顺序和静态代码块和匿名代码块的区别
静态代码块和匿名代码块的区别 静态块: static { } 匿名块: { } 静态块只在类第一次被加载的时候执行一次,一般用于进行初始化工作; 匿名块在每一次创建本 ...
- 加载顺序_JAVA类代码块和属性的加载顺序问题,不要以为静态块始终最先执行了!...
类代码块和属性的加载顺序问题,不要以为静态块始终最先执行了! 我们知道在一个类中,类的加载顺序为 静态代码块-->普通代码块-->构造代码块,感觉静态块始终是最先初始化的,其实并不是,下面 ...
- Java基础:Java代码加载顺序
Java代码加载顺序 代码块 类加载和初始化相关案例一 案例二 深度加载知识 静态变量 内部类中不能定义静态变量 代码块 项目 Value 作用 局部代码块 在main方法里面 给变量限定声明周期,局 ...
- HTML基础和JSP了解及JSP中代码加载顺序
HTML入门基础教程 html是什么,什么是html通俗解答: html是hypertext markup language的缩写,即超文本标记语言.html是用于创建可从一个平台移植到另一平台的超文 ...
- java类加载 静态变量和构造方法加载顺序
demo1 /*** java规定,变量没有初始化不能使用,全局变量也就是类的属性,java会在编译的时候,自动将他们初始化,* 所以可以不进行变量初始化的操作,☆☆☆☆☆但是(局部)变量必须初始化☆ ...
最新文章
- 算法设计与分析第3章 贪心算法
- java里冒泡排序编程案例_java编程题:用Java实现一个冒泡排序算法
- mongodb AND查询遇到多个index时候可能会做交集——和复合索引不同
- 预训练模型:BERT深度解析《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》
- 中国电力行业运行形势及十四五供需状况分析报告2021-2027年
- 使用反应流API将Akka流与rxJava结合在一起
- poj2115C Looooops
- 千亿企业的真实业务思考,名校大厂高手同台 PK,“马栏山杯”国际音视频算法大赛来袭!...
- dataimagepng php_PHP decode data:image/png;base64
- 2018年美国专利数量公布:IBM夺榜首 华为排第19
- 北京地区常用dns地址解析速度快
- 蛇哥开局两星机器人视频_虎牙蛇哥五排上演末日人机套路 对面玩家被血虐
- 《谁说大象不能跳舞》值得一读
- 韩信点兵问题(中国剩余定理)
- CTGU实验5_2-创建还书罚款触发器
- 最新支付宝蚂蚁森林自动偷能量,解放双手
- idea创建maven项目失败, Failed to create a Maven project
- 那些像段子一样的生活经历1csdn
- 计算机主板维修高手,计算机电路基础与维修高手
- TrestZone入门解读