java构造函数的执行顺序

   点击上面  免费订阅本账号!

本公众号主要推送javaweb开发相关技术,基础知识点,同时会深入剖析复杂的问题,分享一些优秀的框架,大型项目经验,当今最流行的Javaweb技术,热点科技新闻,招聘信息,生活乐趣等等。点击上方的蓝字,这样您每天可以看到更多的java知识和资讯!完全是免费订阅,请放心关注

原文地址:http://bbs.itheima.com/thread-332751-1-1.html

昨天在改一处代码时发现执行的过程和预想的不一样,仔细探究才发现是构造器执行顺序问题.(汗自己一下,基础不够扎实) 
特地做了一些尝试然后把java构造器的执行顺序整理出来.
首先是我测试的代码:

 
执行结果如下: 
FatherProp is construct
Father is construct
SonProp is construct
Son is construct
由此不难看出java类初始化时构造函数调用顺序:
(1)初始化对象的存储空间为零或null值;
(2)按顺序分别调用父类成员变量和实例成员变量的初始化表达式;
(3)调用父类构造函数;(如果实用super()方法指定具体的某个父类构造函数则使用指定的那个父类构造函数)
(4)按顺序分别调用类成员变量和实例成员变量的初始化表达式;
(5)调用类本身构造函数。

评论:

1. 初始化分为为的初始化和实例的初始化 
2. 每个类在 JVM 中都对应一个 Class 实例 
3. 父类实例是作为子例的部分存在的 (Class 实例之间也存在父子关系) 
4. 初始化实例之前要初始化类 

基于以上几点就可以理解以下初始化顺序 
1. 父类静态属性、静态类 (父类的初始化,对应 JVM 方法 cinit()) 
2. 子类的静态属性、静态类 (子类的初始化,对应 JVM 方法 cinit()) 
3. 父类的实例构造,实例变量初始化 (实例变量初始实际会放到 JVM 的 init() 中) 
4. 子类的实例构造,实例变量初始化 (也是对应的 init() 方法) 

关于类的 Class 实例,可以回想 Log 的声明 
Log log = LogFactory.getLog(TestClass.class); 
也就是无论你,new 多少个 TestClass 实例,它们对应着同一个 TestClass 的 Class 实例,也就是为什么很多地方把静态方法、静态属性说成是类的方法、类的属性,其实质就是在 JVM 中存在同一个 Class 实例的方法、属性,也就能保持一致性。 

关于父类实例是作为子类的一部分存在,可借鉴 C++ 或是有面向对象特性的 C 函数库(如 gtk),来理解,父类实例会居于子类实例的首地址,所以对子类转型成父类实例时,它是安全的,因为首地址一样的,所以从首地址到 size(父类)就是父类实例地址空间,到size(子类)就是子类实例的地址空间。

点击阅读全文查看 史上最全的Java基础视频大全(必收藏)

有人用微信聊天,有人却在微信中学习,成长。下面是2016最HOT IT公众号,赶快试试新的关注方法吧!


关注方式
★长按二维码,选择“识别图中二维码”进行关注。

 没看够?更多好文在阅读原文

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值