Java构造方法和变量初始化的执行顺序

Posted JOKER-Q

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java构造方法和变量初始化的执行顺序相关的知识,希望对你有一定的参考价值。

事前小栗子

例1

例2

2、事后结论先总结

Java变量的初始化顺序:
静态变量或静态语句块----->实例变量或初始化语句块----->构造方法
(注:这里实例变量的初始化是在构造方法中第一条指令执行前执行的,注意并不是构造方法之前)

3、举例详解

父类:

子类:

测试结果:

执行顺序说明

new C().println()执行顺序

1、执行父类B的静态代码块( 输出qwe

2、执行子类C的静态代码块( 输出123

至此,父类和子类中所有的静态代码块执行结束,开始执行各类的实例变量初始化和构造函数

3、执行父类B的实例变量初始化操作(B类中i现值为123,s现值为234)

至此,父类的实例变量初始化完毕,开始执行父类的构造函数

4、执行父类B的构造函数( 输出”enter B()”

5、执行父类B的init方法(因为方法的多态性,调用的是子类C的init方法)

6、父类调用子类C的init方法( 输出”enter C.init”,C类的i和s赋值为100,输出”exit C.init”

7、父类调用子类C的init方法执行完毕,回到父类B中继续执行( 输出”exit B()”

至此,父类的构造函数执行完毕,开始执行子类的实例变量初始化

8、执行子类C的inits方法,对实例变量S初始化( 输出”enter C.inits”,”exit C.inits”,C类中i现值为100,s现值为0

至此,子类的实例变量初始化完毕,开始执行子类的构造函数
9、执行子类C的构造函数( 输出”enter C()”,”exit C()”

至此,new C(),类C对象初始化完毕,开始执行对象.println()方法

10、执行对象的println()方法( 输出”enter C.println”,i现值:100,S现值:0,”exit C.println”

至此,new C().println()语句执行完毕

后面两条测试语句和本例同理,要注意的是,方法有多态性但是属性没有,调用的是哪个类的对象的属性,就输出的是哪个对象中该属性的值</font>

附:Spring中@Autowired注解和构造函数的执行顺序

@Autowired一定要等本类构造完成后,才能从外部引用设置进来
所以@Autowired的注入时间一定会晚于构造函数的执行时间。但在初始化变量的时候就使用了还没注入的bean,所以导致了NPE。如果在初始化其它变量时不使用这个要注入的bean,而是在以后的方法调用的时候去赋值,是可以使用这个bean的,因为那时类已初始化好,即已注入好了。

再回头看看事前的例子,是不是拨开云雾见青天了呢😆

以上是关于Java构造方法和变量初始化的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

Java:初始化块静态初始化块构造方法的执行顺序

java中创建对象了,显示初始化值和构造函数初始化对象的区别?先后执行顺序是啥?

java类及实例初始化顺序

java中静态方法,静态变量,静态初始化器,构造函数,属性初始化都是啥时候调用的? 它们的先后顺序。

随笔25 java中的类加载顺序

Java初始化顺序(静态变量静态初始化块实例变量实例初始化块构造方法)