对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。

初始化顺序图示:

我们也可以通过下面的测试代码来验证这一点:

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类的初始化顺序相关推荐

  1. java类成员初始化_简单了解Java类成员初始化顺序

    这篇文章主要介绍了简单了解Java类成员初始化顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类中包含7中成员: 1.静态变量 static 2 ...

  2. Java 类的初始化顺序

    Java 类的初始化顺序 Java中类的初始化顺序是:父类静态代码块-->子类静态代码块-->父类非静态代码块-->父类构造器-->子类非静态代码块-->子类构造器. 测 ...

  3. android 初始化类,Android 常用编程技巧/Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)...

    1.设置屏幕的亮度: WindowManager.LayoutParams lp=getWindow().getAttributes(); lp.screenBrightness=1.0f; getW ...

  4. Java类的初始化顺序 (静态变量、静态初始化块、变量、初始...

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

  5. java类内容初始化顺序

    在java类中一般有:成员变量.静态变量.成员方法.静态方法.构造方法.那么这几个的初始化顺序是什么呢? 初始化的先后顺序是:静态变量(类load进内存就初始化)------静态代码块(类load进内 ...

  6. java 初始化参数_JAVA类的初始化顺序与initialize参数

    JAVA类的初始化顺序依次是:(静态变量.静态初始化块)->(变量.初始化块)->构造函数, 相同级别的以定义顺序为准,  且静态变量和静态初始化块只初始化一次.通过下面的代码来验证. p ...

  7. java类的运行顺序_Java语言类的基本运行顺序

    本文主要向大家介绍了Java语言类的基本运行顺序,通过具体的代码向大家展示,希望对大家学习Java语言有所帮助.我们以下面的类来说明一个基本的 Java 类的运行顺序:1. public class  ...

  8. java创建对象 的初始化顺序

    java创建对象 的初始化顺序 1.初始化块 初始化块通常写在类的构造方法之前,由花括号括起来,通常包含对成员属性进行初始化的语句: 初始化块分为instance初始化块和static初始化块,初始化 ...

  9. Java类的初始化、变量的初始化

    Java类的初始化.变量的初始化 知识点 Java常量,   final 修饰,值被设定后不能再被修改 静态变量里,  static 修饰,顾名思义,无须创建对象,便可在内存中申请一个存储空间进行存储 ...

最新文章

  1. 高性能NoSql数据库 SSDB
  2. Git单人本地仓库操作
  3. Selenium3自动化测试——5. 鼠标悬停操作
  4. 怎么在ASP.NET中写HTML,如何:在 ASP.NET 网页中设置控件的 HTML 属性
  5. JavaScript对Json的增删改属性
  6. RocketMQ源码学习
  7. Redis管理各类型存储数据命令
  8. xshell 常用配置_Xshell连接报Connection closed by foreign host错误的解决办法
  9. python代码编写_高质量Python代码编写的5个优化技巧
  10. 区块链 链上脚本、智能合约和Dapp的关系区别
  11. python函数手册pdf_Python参考手册(第4版 修订版) ([美]大卫 M.比兹利) 中文pdf扫描版[102MB]...
  12. 【原文件】辞海(第六版彩图本) pdf
  13. 882. Reachable Nodes In Subdivided Graph
  14. 台式计算机键盘快捷键怎么设置,电脑快捷键设置修改 电脑键盘快捷键怎么更改...
  15. Git- 报错 error: bad signature 0x00000000 fatal: index file corrupt
  16. 今日恐慌与贪婪指数为20 恐慌程度有所上升
  17. 本地生活O2O行业已经逐渐渗透到日常生活中
  18. 南昌大学计算机就业能去哪,几所就业率高的211院校,考生毕业后就业不用愁!...
  19. 达芬奇 - 构建数据查询API的框架
  20. 【Industry digitization】数字化技术正在全球范围内迅猛发展,世界各国和企业纷纷开启数字化转型之路

热门文章

  1. css如何设置高亮显示,Javascript实现CSS代码高亮显示
  2. Canvas的使用,根据坐标在图片中画出矩形,框图
  3. Logistic回归做分类或预测(实战代码)
  4. 2022-2028年全球与中国自动细胞分选机行业市场深度调研及投资预测分析
  5. 试用D触发器和必要的门电路(或最小数量的中规模集成电路芯片)设计两位串行输入、并行输出双向移位寄存器. 寄存器有X、K两个输入端, K控制移位方向, X输入数据(题目全文见本博文示)
  6. TypeScript+Vue3.0笔记
  7. Javascript本地存储的方式有哪些?区别及应用场景?
  8. Android Jetpack 库架构组件 Room+Paging 基础使用
  9. 转的心服口服,工程郎难道真的单身?
  10. Android修改EditText光标下的水滴状,TextView选择的左右选择指示器