根据《Thinking in Java》相关章节及自己的理解举例来说明类初始化顺序。

public class InitialOrder {private static String staticField = "Static Field Initial";private String field = "Field Initial";static {System.out.println(staticField);System.out.println("Static Patch Initial");}{System.out.println(field);System.out.println("Field Patch Initial");}public InitialOrder() {System.out.println("Structure Initial ");}public static void main(String[] argc) {new InitialOrder();}
}

Static Field Initial (静态变量)
Static Patch Initial (静态初始化块)
Field Initial (变量)
Field Patch Initial (初始化块)
Structure Initial (构造器)

public class ParentInitialOrder {private static String staticField = "Parent Static Field Initial";private String field = "Parent Field Initial";static {System.out.println(staticField);System.out.println("Parent Static Patch Initial");}{System.out.println(field);System.out.println("Parent Field Patch Initial");}public ParentInitialOrder() {System.out.println("Parent Structure Initial ");}}public class ChildInitialOrder extends ParentInitialOrder {private static String staticField = "Child Static Field Initial";private String field = "Child Field Initial";static {System.out.println(staticField);System.out.println("Child Static Patch Initial");}{System.out.println(field);System.out.println("Child Field Patch Initial");}public ChildInitialOrder() {System.out.println("Child Structure Initial ");}public static void main(String argv[]) {new ChildInitialOrder();}
}

Parent Static Field Initial
Parent Static Patch Initial
Child Static Field Initial
Child Static Patch Initial
Parent Field Initial
Parent Field Patch Initial
Parent Structure Initial
Child Field Initial
Child Field Patch Initial
Child Structure Initial

测试题:

public class InitialOrderTest {public static int k = 0;public static InitialOrderTest t1 = new InitialOrderTest("t1");public static InitialOrderTest t2 = new InitialOrderTest("t2");public static int i = print("i");public static int n = 99;public int j = print("j");static {print("静态块");}{print("构造块");}public InitialOrderTest(String str) {System.out.println((++k) + ":" + str + "    i=" + i + "    n=" + n);++i;++n;}public static int print(String str) {System.out.println((++k) + ":" + str + "    i=" + i + "    n=" + n);++n;return ++i;}public static void main(String[] args) {// TODO Auto-generated method stubInitialOrderTest t = new InitialOrderTest("init");}
}

1:j i=0 n=0
2:构造块 i=1 n=1
3:t1 i=2 n=2
4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:静态块 i=7 n=99
9:j i=8 n=100
10:构造块 i=9 n=101
11:init i=10 n=102

上面是程序的输出结果,下面我来一行行分析之。

1、我们要调用InitialOrderTest类的static方法main,所以JVM会在classpath中加载InitialOrderTest.class,然后对所有static的成员变量进行默认初始化。这时k、i、n被赋值为0,t1、t2被赋值为null。
2、又因为static变量被显式赋值了,所以进行显式初始化,当对t1进行显式赋值时,用new的方法调用了Alibaba的构造函数,所以这次需要对t1对象进行初始化。因为InitialOrderTest所有static部分已经在第一步中初始化过了(虽然第一步中还没有执行static块,但在初始化t1时也不会去执行static块,因为JVM认为这次是第二次加载InitialOrderTest这个类了,所有的static部分都会被忽略掉),所以这次直接初始化非static部分。于是有了

1:j i=0 n=0
2:构造块 i=1 n=1
3:t1 i=2 n=2

接着对t2进行赋值,过程与t1相同

4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5

t1、t2这两个static成员变量赋值完后到了static的i与n,于是有了下面的输出:

7:i i=6 n=6

到现在为止,所有的static的成员变量已经被第二次赋值过了,下面到static块了

静态块 i=7 n=99

至此,所有的static部分赋值完毕了,下面开始执行main方法里面的内容,因为main方法的第一行就又用new的方式调用了InitialOrderTest的构造函数,所以其过程与t1、t2类似

9:j i=8 n=100
10:构造块 i=9 n=101
11:init i=10 n=102

Java类中的初始化顺序相关推荐

  1. Java类中变量初始化顺序

    下面代码显示了静态初始化代码块,非静态实例初始化代码块,构造函数 等在Java中从代码载入内存到代码执行过程的执行顺序: import static net.mindview.util.Print.* ...

  2. c++构造函数以及类中变量初始化顺序

    c++构造函数以及类中变量初始化顺序 Submitted by ant on Fri, 03/29/2013 - 20:05 构造函数 c++ 的类提供了一种抽象机制,使用起来要比 c 方便很多.为了 ...

  3. java类中变量初始化

    一般的初始化 public class BedAndBreakfast {// initialize to 10public static int capacity = 10;// initializ ...

  4. java继承中的初始化顺序

    初始化顺序:父类的静态变量-->父类的静态代码块-->子类的静态变量-->子类的静态代码快-->父类的非静态变量(父类的非静态代码块)-->父类的构造函数-->子类 ...

  5. java类中,成员变量赋值第一个进行,其次是静态构造函数,再次是构造函数

    如题是结论,如果有人问你Java类的成员初始化顺序和初始化块知识就这样回答他.下面是代码: package com.test;public class TestClass{// 成员变量赋值第一个执行 ...

  6. Java类中各元素的初始化顺序

    Java类中各元素的初始化顺序 初始化的原则是: 先初始化静态部分,再初始化动态部分:(先静再动) 先初始化父类部分,后初始化子类部分:(先父再子) 先初始化变量,次初始化代码块,再初始化构造器:(先 ...

  7. java类的静态成员初始化_Java类的初始化顺序 (静态变量、静态初始化块、变量、初始......

    很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...

  8. java类成员变量初始化_探讨Java类中成员变量的初始化方式

    在 Java 里定义一个类的时候,很多时候我们需要提供成员变量,成员变量专业叫法是 Memeber Variable 或者干脆的叫作 Field. 根据是否使用 static 关键字修饰,可以将 Fi ...

  9. 构造方法、类的初始化块以及类字段的初始化顺序

    构造方法 首先,以下代码为何无法通过编译?哪儿出错了? public class Test {public static void main(String[] args) {Foo obj1 = ne ...

最新文章

  1. VS Code配置PHP XDebug
  2. C++添加程序到windows的启动项的代码
  3. 『原创』再谈用 php 实现域名 whois 信息查询
  4. 初始Angularjs2
  5. Word2Vec学习笔记(一)
  6. 计算机信息检索工作的原理,2021年湖北自考计算机信息检索课程考试大纲
  7. 关于 Spring 中 getBean 的全流程源码解析
  8. 微生物测序分析LEfSe
  9. 将孤独视作挑战,倾听内心,自我对话
  10. DeepFake检测论文汇总
  11. java 查看内存占用_查看JVM内存使用状况
  12. Codeforces869C The Intriguing Obsession
  13. 微信:签名不对,请检查签名是否与开放平台上填写的一致
  14. python使用pymysql包,操作mysql数据库,包括安装及使用(附代码)
  15. uniapp插件-腾讯云播放器sdk插件-腾讯云高清播放器-多码率支持-截图-播放控制-变速播放
  16. window10鼠标加速怎么关_鼠标加速怎么关闭_电脑鼠标加速如何关闭
  17. 分布式架构之CAP理论/AP架构/CP架构
  18. 用 Python 把你的朋友变成表情包
  19. 十大算法之弗洛伊德算法
  20. 技术小白真能通过IT培训高薪就业吗?

热门文章

  1. 企业数字化转型之三阶段
  2. 管理类联考——英语二——技巧篇——写作——图表作文——万能句
  3. Linux系统中解决没有中文输入法
  4. 无人机上的光流定位通常适用于_优象光流模块助力无人机之使用效果分享
  5. SQL 三表关联查询
  6. Slicer4j运行defects4j(二)--运行benchmarks项目
  7. CSS学习笔记——滑动门技术
  8. FPGA学习笔记(八):ASK调制解调的仿真
  9. 一篇入门深度学习OCR:数据集和算法合集
  10. ActiveMQ原理教程