Java类的初始化顺序
对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。
初始化顺序图示:
我们也可以通过下面的测试代码来验证这一点:
package com.trs.oop;/*** 类的初始化顺序* 静态变量->静态初始化块->变量->初始化块->构造器* @author xiayunan* @date 2018年7月5日**/
public class InitialOrderTest { // 静态变量 public static String staticField = "静态变量";// 变量 public String field = "变量"; // 静态初始化块 static { System.out.println(staticField); System.out.println("静态初始化块"); } // 初始化块 { System.out.println(field); System.out.println("初始化块"); } // 构造器 public InitialOrderTest() { System.out.println("构造器"); } public static void main(String[] args) {new InitialOrderTest(); }
}
运行结果:
而对于继承的情况初始化顺序又会是怎么样的呢?请看下面示例代码:
package com.trs.oop;/*** 有继承关系的类初始化顺序* @author xiayunan* @date 2018年7月5日**/
class Parent { // 静态变量 public static String p_StaticField = "父类--静态变量";protected int i = 1;protected int j = 8;// 变量 public String p_Field = "父类--变量"; // 静态初始化块 static { System.out.println(p_StaticField); System.out.println("父类--静态初始化块"); } // 初始化块 { System.out.println(p_Field); System.out.println("父类--初始化块"); } // 构造器 public Parent() { System.out.println("父类--构造器"); System.out.println("i=" + i + ", j=" + j);j = 9;}
} public class SubClass extends Parent {// 静态变量 public static String s_StaticField = "子类--静态变量";// 变量 public String s_Field = "子类--变量"; // 静态初始化块 static { System.out.println(s_StaticField); System.out.println("子类--静态初始化块"); } // 初始化块 { System.out.println(s_Field); System.out.println("子类--初始化块"); } // 构造器 public SubClass() { System.out.println("子类--构造器"); System.out.println("i=" + i + ",j=" + j);} // 程序入口 public static void main(String[] args) {new SubClass(); }
}
运行结果:
现在,结果已经不言自明了。子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。
静态变量、静态初始化块,变量、初始化块初始化了顺序取决于它们在类中出现的先后顺序。
执行过程分析
(1)访问SubClass.main(),(这是一个static方法),于是装载器就会为你寻找已经编译的SubClass类的代码(也就是SubClass.class文件)。在装载的过程中,装载器注意到它有一个基类(也就是extends所要表示的意思),于是它再装载基类。不管你创不创建基类对象,这个过程总会发生。如果基类还有基类,那么第二个基类也会被装载,依此类推。
(2)执行根基类的static初始化,然后是下一个派生类的static初始化,依此类推。这个顺序非常重要,因为派生类的“static初始化”有可能要依赖基类成员的正确初始化。
(3)当所有必要的类都已经装载结束,开始执行main()方法体,并用new SubClass()创建对象。
(4)类SubClass存在父类,则调用父类的构造函数,你可以使用super来指定调用哪个构造函数(也就是Beetle()构造函数所做的第一件事)。
基类的构造过程以及构造顺序,同派生类的相同。首先基类中各个变量按照字面顺序进行初始化,然后执行基类的构造函数的其余部分。
(5)对子类成员数据按照它们声明的顺序初始化,执行子类构造函数的其余部分。
Java类的初始化顺序相关推荐
- java类成员初始化_简单了解Java类成员初始化顺序
这篇文章主要介绍了简单了解Java类成员初始化顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类中包含7中成员: 1.静态变量 static 2 ...
- Java 类的初始化顺序
Java 类的初始化顺序 Java中类的初始化顺序是:父类静态代码块-->子类静态代码块-->父类非静态代码块-->父类构造器-->子类非静态代码块-->子类构造器. 测 ...
- android 初始化类,Android 常用编程技巧/Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)...
1.设置屏幕的亮度: WindowManager.LayoutParams lp=getWindow().getAttributes(); lp.screenBrightness=1.0f; getW ...
- Java类的初始化顺序 (静态变量、静态初始化块、变量、初始...
很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...
- java类内容初始化顺序
在java类中一般有:成员变量.静态变量.成员方法.静态方法.构造方法.那么这几个的初始化顺序是什么呢? 初始化的先后顺序是:静态变量(类load进内存就初始化)------静态代码块(类load进内 ...
- java 初始化参数_JAVA类的初始化顺序与initialize参数
JAVA类的初始化顺序依次是:(静态变量.静态初始化块)->(变量.初始化块)->构造函数, 相同级别的以定义顺序为准, 且静态变量和静态初始化块只初始化一次.通过下面的代码来验证. p ...
- java类的运行顺序_Java语言类的基本运行顺序
本文主要向大家介绍了Java语言类的基本运行顺序,通过具体的代码向大家展示,希望对大家学习Java语言有所帮助.我们以下面的类来说明一个基本的 Java 类的运行顺序:1. public class ...
- java创建对象 的初始化顺序
java创建对象 的初始化顺序 1.初始化块 初始化块通常写在类的构造方法之前,由花括号括起来,通常包含对成员属性进行初始化的语句: 初始化块分为instance初始化块和static初始化块,初始化 ...
- Java类的初始化、变量的初始化
Java类的初始化.变量的初始化 知识点 Java常量, final 修饰,值被设定后不能再被修改 静态变量里, static 修饰,顾名思义,无须创建对象,便可在内存中申请一个存储空间进行存储 ...
最新文章
- 高性能NoSql数据库 SSDB
- Git单人本地仓库操作
- Selenium3自动化测试——5. 鼠标悬停操作
- 怎么在ASP.NET中写HTML,如何:在 ASP.NET 网页中设置控件的 HTML 属性
- JavaScript对Json的增删改属性
- RocketMQ源码学习
- Redis管理各类型存储数据命令
- xshell 常用配置_Xshell连接报Connection closed by foreign host错误的解决办法
- python代码编写_高质量Python代码编写的5个优化技巧
- 区块链 链上脚本、智能合约和Dapp的关系区别
- python函数手册pdf_Python参考手册(第4版 修订版) ([美]大卫 M.比兹利) 中文pdf扫描版[102MB]...
- 【原文件】辞海(第六版彩图本) pdf
- 882. Reachable Nodes In Subdivided Graph
- 台式计算机键盘快捷键怎么设置,电脑快捷键设置修改 电脑键盘快捷键怎么更改...
- Git- 报错 error: bad signature 0x00000000 fatal: index file corrupt
- 今日恐慌与贪婪指数为20 恐慌程度有所上升
- 本地生活O2O行业已经逐渐渗透到日常生活中
- 南昌大学计算机就业能去哪,几所就业率高的211院校,考生毕业后就业不用愁!...
- 达芬奇 - 构建数据查询API的框架
- 【Industry digitization】数字化技术正在全球范围内迅猛发展,世界各国和企业纷纷开启数字化转型之路
热门文章
- css如何设置高亮显示,Javascript实现CSS代码高亮显示
- Canvas的使用,根据坐标在图片中画出矩形,框图
- Logistic回归做分类或预测(实战代码)
- 2022-2028年全球与中国自动细胞分选机行业市场深度调研及投资预测分析
- 试用D触发器和必要的门电路(或最小数量的中规模集成电路芯片)设计两位串行输入、并行输出双向移位寄存器. 寄存器有X、K两个输入端, K控制移位方向, X输入数据(题目全文见本博文示)
- TypeScript+Vue3.0笔记
- Javascript本地存储的方式有哪些?区别及应用场景?
- Android Jetpack 库架构组件 Room+Paging 基础使用
- 转的心服口服,工程郎难道真的单身?
- Android修改EditText光标下的水滴状,TextView选择的左右选择指示器