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

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();

}

}

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

1. 静态变量

2. 静态初始化块

3. 变量

4. 初始化块

5. 构造器

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

class Parent {

// 静态变量

public static String p_StaticField = "父类--静态变量";

// 变量

public String p_Field = "父类--变量";

protected int i = 9;

protected int j = 0;

// 静态初始化块

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 = 20;

}

}

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) {

System.out.println("子类main方法");

new SubClass();

}

}

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

父类--静态变量

父类--静态初始化块

子类--静态变量

子类--静态初始化块

子类main方法

父类--变量

父类--初始化块

父类--构造器

i=9, j=0

子类--变量

子类--初始化块

子类--构造器i=9,j=20

现在,结果已经不言自明了。子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。

静态变量、静态初始化块,变量、初始化块初始化了顺序取决于它们在类中出现的先后顺序。

执行过程分析

(1)访问SubClass.main(),(这是一个static方法),于是装载器就会为你寻找已经编译的SubClass类的代码(也就是SubClass.class文件)。在装载的过程中,装载器注意到它有一个基类(也就是extends所要表示的意思),于是它再装载基类。不管你创不创建基类对象,这个过程总会发生。如果基类还有基类,那么第二个基类也会被装载,依此类推。

(2)执行根基类的static初始化,然后是下一个派生类的static初始化,依此类推。这个顺序非常重要,因为派生类的“static初始化”有可能要依赖基类成员的正确初始化。

(3)当所有必要的类都已经装载结束,开始执行main()方法体,并用new SubClass()创建对象。

(4)类SubClass存在父类,则调用父类的构造函数,你可以使用super来指定调用哪个构造函数(也就是Beetle()构造函数所做的第一件事)。

基类的构造过程以及构造顺序,同派生类的相同。首先基类中各个变量按照字面顺序进行初始化,然后执行基类的构造函数的其余部分。

java类编来那个初始化顺序_java类的初始化顺序相关推荐

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

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

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

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

  3. java初始化实例化_java类的初始化和实例化区别

    结论: 参考https://blog.csdn.net/qq_43672627/article/details/86616624 类的初始化:是完成程序执行前的准备工作.在这个阶段,静态的(变量,方法 ...

  4. java类编来那个初始化顺序_Java类及对象的初始化顺序

    1.初始化规则: 下面规则优先级从前往后依次降低 ①.加载一个类时先加载初始化基类后加载初始化扩展类: ②.类的初始化高于实例的初始化: 类的初始化依靠(静态代码块static{....})以及(静态 ...

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

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

  6. java类定义的顺序_Java类及对象的初始化顺序

    1.初始化规则: 下面规则优先级从前往后依次降低 0.加载一个类时先初始化基类后初始化扩展类: 1.类的初始化高于对象的初始化: 类的初始化依靠静态代码(被static标识的),静态代码块.静态变量这 ...

  7. java初始化实例化_Java 类初始化和实例化以及多态理解

    前言 本篇主要讲解了类的初始化.实例化.静态代码块.构造器.getClass().super.this 等相关的知识点,做一个总结. demo 老规矩,看代码: Father.java public ...

  8. java 接口初始化_Java类的初始化 | 学步园

    类的初始化时机1.创建类的实例 2.访问类或接口的静态变量(static final常量除外,static final变量可以)3.调用类的静态方法 4.反射(Class.forName(packag ...

  9. java创建两个foo方法_Java类实例化原理 - osc_foo7glsg的个人空间 - OSCHINA - 中文开源技术交流社区...

    Java对象的创建过程包括类初始化(类实例化两个阶段. 一.Java对象创建时机 (1)使用new关键字创建对象 (2)反射创建对象 使用Class类的newInstance方法 Student st ...

最新文章

  1. 大连理工计算机专业导师,大连理工大学计算机科学与技术学院研究生导师简介-申彦明...
  2. react 打包后,项目部署完毕,刷新页面报错(404)
  3. 路由交换以及其他网络名词基本概念
  4. Undefined symbols for architecture i386问题解决方法
  5. centos7 安装nginx报错./configure: error: the HTTP rewrite module requires the PCRE library
  6. php 多个文件,PHP一个文件显示多个不同页面是什么机制?
  7. Again Twenty Five!
  8. psenet的eval_ctw1500.py解析
  9. css宋体代码_CSS字体代码
  10. detectron2训练自己的数据集_从零教你训练自己的数据集实现汽车标志识别,汽车品牌识别源码
  11. 墨卡托与经纬度转换工具
  12. JavaScript发送短信案例
  13. scipy--统计检验
  14. 90%的android开发者都会遇到的问题,当sjk_daemon遇见ADB server didn't ACK
  15. curl服务器文件,curl 向远程服务器传输file文件
  16. 关于ADC芯片的选型
  17. A股实践 :图神经网络与新闻共现矩阵策略(附代码)
  18. 硬件艺术家Cauchy吉林省机器人大赛智能无人仿真车竞速比赛赛后总结
  19. 什么是128陷阱?什么是装箱?什么是拆箱?为什么要有包装类?
  20. 多模型的ROC曲线绘制

热门文章

  1. PHP cURL获取微信公众号access_token
  2. vue本地存储案例_本地化还是创意适应? 流氓游戏街的案例研究
  3. 经常用的命令一(linux)
  4. win32进程共享内存
  5. 内存池简单实现(一)
  6. 借助数商云房地产行业采购平台解决方案,实现简单、智能、合规的采购
  7. 于是,我整个人都斯巴达了
  8. 高性能MySQL之 Chapter13
  9. Oracle设置主键报错 ORA-02437: 无法验证 (DENGCHAO.TEST) - 违反主键
  10. 百度地图 测距功能 DistanceTool 在不同浏览器下标注不一致的解决办法,打开新地图测距不生效的解决办法