Java构造方法和变量初始化的执行顺序
2022/1/14 17:04:43
本文主要是介绍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构造方法和变量初始化的执行顺序的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11有哪些好用的家政团队管理工具?
- 2025-01-11营销人必看的GTM五个指标
- 2025-01-11办公软件在直播电商前期筹划中的应用与推荐
- 2025-01-11提升组织效率:上级管理者如何优化跨部门任务分配
- 2025-01-11酒店精细化运营背后的协同工具支持
- 2025-01-11跨境电商选品全攻略:工具使用、市场数据与选品策略
- 2025-01-11数据驱动酒店管理:在线工具的核心价值解析
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide
- 2025-01-11不得不了解的高效AI办公工具API