java类初始化顺序
我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:
- 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();
- }
- }
运行以上代码,我们会得到如下的输出结果:
- 静态变量
- 静态初始化块
- 变量
- 初始化块
- 构造器
这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果:
- class Parent {
- // 静态变量
- public static String p_StaticField = "父类--静态变量";
- // 变量
- 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("父类--构造器");
- }
- }
- 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("子类--构造器");
- }
- // 程序入口
- public static void main(String[] args) {
- new SubClass();
- }
- }
运行一下上面的代码,结果马上呈现在我们的眼前:
- 父类--静态变量
- 父类--静态初始化块
- 子类--静态变量
- 子类--静态初始化块
- 父类--变量
- 父类--初始化块
- 父类--构造器
- 子类--变量
- 子类--初始化块
- 子类--构造器
现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。
那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序。我们以静态变量和静态初始化块为例来进行说明。
同样,我们还是写一个类来进行测试:
- public class TestOrder {
- // 静态变量
- public static TestA a = new TestA();
- // 静态初始化块
- static {
- System.out.println("静态初始化块");
- }
- // 静态变量
- public static TestB b = new TestB();
- public static void main(String[] args) {
- new TestOrder();
- }
- }
- class TestA {
- public TestA() {
- System.out.println("Test--A");
- }
- }
- class TestB {
- public TestB() {
- System.out.println("Test--B");
- }
- }
运行上面的代码,会得到如下的结果:
- Test--A
- 静态初始化块
- Test--B
java类初始化顺序相关推荐
- 【知识总结】Java类初始化顺序说明
微信公众号:努力编程的小猪 如有问题或建议,请公众号留言 Java类初始化顺序说明 一个类中包含如下几类东西,他们前后是有顺序关系的 静态属性:static 开头定义的属性 静态方法块: static ...
- (转)java类初始化顺序 - jackyrong的世界 - 博客园
(转)java类初始化顺序 我们大家都知道,对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器.我们也可以通过 ...
- java类初始化顺序_Java 类的初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次 构造代码块:类中直接用{}定义,每一次创建对象时执行 执行顺序优先级:静态块,main(),构造块,构造方法 1. 构造函数 publi ...
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
构造函数 public HelloA(){//构造函数} 关于构造函数,以下几点要注意: 1.对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的. 2.构造函数的作用是 ...
- 面试题:Java类初始化顺序
1. 问题来源 你遇到过哪些质量很高的 Java 面试? - ZO01的回答 - 知乎 https://www.zhihu.com/question/60949531/answer/579002882 ...
- Java类初始化顺序(变量赋值与静态代码块的执行时间)
前言:最近写代码的时候经常见到见到static代码块,不由对static的执行时间产生了兴趣,进而对类初始化顺序产生了兴趣. 类从编译到执行的过程: 在使用ClassLoader将字节码转换为JVM中 ...
- 一文详解Java类初始化顺序
目录 一.普通类 二.包含继承关系 三.包含接口.抽象类关系 本文将介绍三种情形下的类初始化顺序. 一.普通类 Java类:Animal.java package ztt.继承接口多态.执行顺序测试; ...
- java类初始化顺序_《To Be a Better Javaer》-- Java 基础篇 vol.2:面向对象
Java是面向对象的高级编程语言,面向对象的特征如下: 面向对象具有抽象.封装.继承.多态等特性: 面向对象可以将复杂的业务逻辑简单化,增强代码复用性: 面向对象是一种常见的思想,比较符合人们的思考习 ...
- JAVA类初始化顺序总结
类的初始化 初始化顺序 首先来看下,当一个类从main入口方法,对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序: public class ClassLoadTest {priv ...
- 对Java类初始化顺序的一些理解
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次 构造代码块:类中直接用{}定义,每一次创建对象时执行. 执行顺序优先级:(静态块| 静态变量) , main(), (构造块|成员变量) ...
最新文章
- java moment 日期转换_关于日期:如何使用Java 8 DateTime API转换修改后的儒略日数字...
- python3.5怎么安装pip-python3.5.2安装pip管理工具
- 数据结构-冒泡排序最优代码(C语言)
- libsvm在matlab中使用的常见错误及libsvm的使用
- AS使用NDK Cmake方式依赖第三方库注意事项
- LaTeX tikz初探——空间矢量旋转示意图,四元数(4)
- Winform文件下载之断点续传
- Oracle→数字函数、字符函数、时间函数、SYSDATE、TO_CHAR()、TO_DATE()、TO_NUMBER()、NVLNVL2NULLIF、ROW_NUMBER()
- 分离圆环图显示百分比_excel这个百分比图,你不一定会制作
- 非标准硬件控制之增加系统API
- AngularJs ngList、ngRepeat、ngModelOptions
- TDH Inceptor 操作实战案例之 验证ACID
- vnc远程连接,5步实现vnc远程连接
- 学在信息——初窥门径
- 基于 ZYNQ 的无线超声数据传输及显示系统的实现
- 定位服务北斗位置云服务器,北斗位置云服务平台操作使用指南(157页)-原创力文档...
- uni-app配置搜索框
- 在Mac下防范“P2P终结者”限速
- Java中通过JNI技术开发一款PC端微信数据库解密备份工具
- openldap主机搭建