我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:

  1. public class InitialOrderTest {
  2. // 静态变量
  3. public static String staticField = "静态变量";
  4. // 变量
  5. public String field = "变量";
  6. // 静态初始化块
  7. static {
  8. System.out.println(staticField);
  9. System.out.println("静态初始化块");
  10. }
  11. // 初始化块
  12. {
  13. System.out.println(field);
  14. System.out.println("初始化块");
  15. }
  16. // 构造器
  17. public InitialOrderTest() {
  18. System.out.println("构造器");
  19. }
  20. public static void main(String[] args) {
  21. new InitialOrderTest();
  22. }
  23. }

运行以上代码,我们会得到如下的输出结果:

  1. 静态变量
  2. 静态初始化块
  3. 变量
  4. 初始化块
  5. 构造器

这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果:

  1. class Parent {
  2. // 静态变量
  3. public static String p_StaticField = "父类--静态变量";
  4. // 变量
  5. public String p_Field = "父类--变量";
  6. // 静态初始化块
  7. static {
  8. System.out.println(p_StaticField);
  9. System.out.println("父类--静态初始化块");
  10. }
  11. // 初始化块
  12. {
  13. System.out.println(p_Field);
  14. System.out.println("父类--初始化块");
  15. }
  16. // 构造器
  17. public Parent() {
  18. System.out.println("父类--构造器");
  19. }
  20. }
  21. public class SubClass extends Parent {
  22. // 静态变量
  23. public static String s_StaticField = "子类--静态变量";
  24. // 变量
  25. public String s_Field = "子类--变量";
  26. // 静态初始化块
  27. static {
  28. System.out.println(s_StaticField);
  29. System.out.println("子类--静态初始化块");
  30. }
  31. // 初始化块
  32. {
  33. System.out.println(s_Field);
  34. System.out.println("子类--初始化块");
  35. }
  36. // 构造器
  37. public SubClass() {
  38. System.out.println("子类--构造器");
  39. }
  40. // 程序入口
  41. public static void main(String[] args) {
  42. new SubClass();
  43. }
  44. }

运行一下上面的代码,结果马上呈现在我们的眼前:

  1. 父类--静态变量
  2. 父类--静态初始化块
  3. 子类--静态变量
  4. 子类--静态初始化块
  5. 父类--变量
  6. 父类--初始化块
  7. 父类--构造器
  8. 子类--变量
  9. 子类--初始化块
  10. 子类--构造器

现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。

那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序。我们以静态变量和静态初始化块为例来进行说明。

同样,我们还是写一个类来进行测试:

  1. public class TestOrder {
  2. // 静态变量
  3. public static TestA a = new TestA();
  4. // 静态初始化块
  5. static {
  6. System.out.println("静态初始化块");
  7. }
  8. // 静态变量
  9. public static TestB b = new TestB();
  10. public static void main(String[] args) {
  11. new TestOrder();
  12. }
  13. }
  14. class TestA {
  15. public TestA() {
  16. System.out.println("Test--A");
  17. }
  18. }
  19. class TestB {
  20. public TestB() {
  21. System.out.println("Test--B");
  22. }
  23. }

运行上面的代码,会得到如下的结果:

  1. Test--A
  2. 静态初始化块
  3. Test--B

java类初始化顺序相关推荐

  1. 【知识总结】Java类初始化顺序说明

    微信公众号:努力编程的小猪 如有问题或建议,请公众号留言 Java类初始化顺序说明 一个类中包含如下几类东西,他们前后是有顺序关系的 静态属性:static 开头定义的属性 静态方法块: static ...

  2. (转)java类初始化顺序 - jackyrong的世界 - 博客园

    (转)java类初始化顺序 我们大家都知道,对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器.我们也可以通过 ...

  3. java类初始化顺序_Java 类的初始化顺序

    静态代码块:用staitc声明,jvm加载类时执行,仅执行一次 构造代码块:类中直接用{}定义,每一次创建对象时执行 执行顺序优先级:静态块,main(),构造块,构造方法 1. 构造函数 publi ...

  4. Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序

    构造函数 public HelloA(){//构造函数} 关于构造函数,以下几点要注意: 1.对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的. 2.构造函数的作用是 ...

  5. 面试题:Java类初始化顺序

    1. 问题来源 你遇到过哪些质量很高的 Java 面试? - ZO01的回答 - 知乎 https://www.zhihu.com/question/60949531/answer/579002882 ...

  6. Java类初始化顺序(变量赋值与静态代码块的执行时间)

    前言:最近写代码的时候经常见到见到static代码块,不由对static的执行时间产生了兴趣,进而对类初始化顺序产生了兴趣. 类从编译到执行的过程: 在使用ClassLoader将字节码转换为JVM中 ...

  7. 一文详解Java类初始化顺序

    目录 一.普通类 二.包含继承关系 三.包含接口.抽象类关系 本文将介绍三种情形下的类初始化顺序. 一.普通类 Java类:Animal.java package ztt.继承接口多态.执行顺序测试; ...

  8. java类初始化顺序_《To Be a Better Javaer》-- Java 基础篇 vol.2:面向对象

    Java是面向对象的高级编程语言,面向对象的特征如下: 面向对象具有抽象.封装.继承.多态等特性: 面向对象可以将复杂的业务逻辑简单化,增强代码复用性: 面向对象是一种常见的思想,比较符合人们的思考习 ...

  9. JAVA类初始化顺序总结

    类的初始化 初始化顺序 首先来看下,当一个类从main入口方法,对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序: public class ClassLoadTest {priv ...

  10. 对Java类初始化顺序的一些理解

    静态代码块:用staitc声明,jvm加载类时执行,仅执行一次 构造代码块:类中直接用{}定义,每一次创建对象时执行. 执行顺序优先级:(静态块| 静态变量) , main(), (构造块|成员变量) ...

最新文章

  1. java moment 日期转换_关于日期:如何使用Java 8 DateTime API转换修改后的儒略日数字...
  2. python3.5怎么安装pip-python3.5.2安装pip管理工具
  3. 数据结构-冒泡排序最优代码(C语言)
  4. libsvm在matlab中使用的常见错误及libsvm的使用
  5. AS使用NDK Cmake方式依赖第三方库注意事项
  6. LaTeX tikz初探——空间矢量旋转示意图,四元数(4)
  7. Winform文件下载之断点续传
  8. Oracle→数字函数、字符函数、时间函数、SYSDATE、TO_CHAR()、TO_DATE()、TO_NUMBER()、NVLNVL2NULLIF、ROW_NUMBER()
  9. 分离圆环图显示百分比_excel这个百分比图,你不一定会制作
  10. 非标准硬件控制之增加系统API
  11. AngularJs ngList、ngRepeat、ngModelOptions
  12. TDH Inceptor 操作实战案例之 验证ACID
  13. vnc远程连接,5步实现vnc远程连接
  14. 学在信息——初窥门径
  15. 基于 ZYNQ 的无线超声数据传输及显示系统的实现
  16. 定位服务北斗位置云服务器,北斗位置云服务平台操作使用指南(157页)-原创力文档...
  17. uni-app配置搜索框
  18. 在Mac下防范“P2P终结者”限速
  19. Java中通过JNI技术开发一款PC端微信数据库解密备份工具
  20. openldap主机搭建

热门文章

  1. 深入探索.NET框架内部了解CLR如何创建运行时对象
  2. addView的误区
  3. 手把手教你从零构建属于自己的小linux
  4. 用户调整listview的column的width处理
  5. Android 和 Chrome OS 融合的可能性
  6. 06- 本地方法接口
  7. The method getTextContent() is undefined ?
  8. (2016北京集训十二)【xsy1542】疯狂求导
  9. RestTemplate使用详解
  10. Python ConfigParser的使用