rocket
走在agile的小路上
BlogJava
首页
新随笔
联系
聚合
管理
随笔-55 评论-208 文章-0 trackbacks-0
一个以前没有注意的问题:java构造函数的执行顺序
昨天在改一处代码时发现执行的过程和预想的不一样,仔细探究才发现是构造器执行顺序问题.(汗自己一下,基础不够扎实)
特地做了一些尝试然后把java构造器的执行顺序整理出来.
首先是我测试的代码:
public
class
Son
extends
Father
{
SonProp r
=
new
SonProp();
public
Son()
{
System.out.println(
"
Son is construct
"
);
}
public
static
void
main(String[] args)
{
new
Son();
}
}
class
Father
{
FatherProp SonProp
=
new
FatherProp();
public
Father()
{
System.out.println(
"
Father is construct
"
);
}
}
class
SonProp
{
public
SonProp()
{
System.out.println(
"
SonProp is construct
"
);
}
}
class
FatherProp
{
public
FatherProp()
{
System.out.println(
"
FatherProp is construct
"
);
}
}
执行结果如下:
FatherProp is construct
Father is construct
SonProp is construct
Son is construct
由此不难看出java类初始化时构造函数调用顺序:
(1)初始化对象的存储空间为零或null值;
(2)按顺序分别调用父类成员变量和实例成员变量的初始化表达式;
(3)调用父类构造函数;(如果实用super()方法指定具体的某个父类构造函数则使用指定的那个父类构造函数)
(4)按顺序分别调用类成员变量和实例成员变量的初始化表达式;
(5)调用类本身构造函数。
posted on 2008-05-27 11:43
rocket
阅读(8185)
评论(6)
编辑
收藏
所属分类:
经验积累
评论:
#
re: 一个以前没有注意的问题:java构造函数的执行顺序 2008-05-27 11:46 |
基金净值
我也才知道,谢谢!
回复
更多评论
#
re: 一个以前没有注意的问题:java构造函数的执行顺序 2008-05-27 12:30 |
隔叶黄莺
借用我在
http://www.blogjava.net/cheneyfree/archive/2008/05/24/202643.html
里写的回复,再次贴来这里来,与博主共勉
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(子类)就是子类实例的地址空间。
回复
更多评论
#
re: 一个以前没有注意的问题:java构造函数的执行顺序 2008-05-27 13:02 |
rocket
@隔叶黄莺
呵呵,还是我们的黄莺扎实啊,以前还真没有仔细研究过jvm。这就去仔细找资料看看。
回复
更多评论
#
re: 一个以前没有注意的问题:java构造函数的执行顺序 2008-05-27 17:33 |
deathnote
笔试了几次,基础很重要啊,收下了。。。。
回复
更多评论
#
re: 一个以前没有注意的问题:java构造函数的执行顺序 2008-05-28 20:49 |
Jack.Wang
LZ 真强大,看来你的 oo 还是不行啊!
最近听一个牛人(国外留学的 doctor),讲中间件的时候讲几次内存模型。真的受益匪浅,改天去你们公司分享一下!
回复
更多评论
#
re: 一个以前没有注意的问题:java构造函数的执行顺序
2012-08-08 10:54 |
王鹏飞
不错,很有帮助
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
roller扩展开发经验小结之xmlrpc
不仁义,不仗义
一个以前没有注意的问题:java构造函数的执行顺序
Dict.CN 在线词典, 英语学习, 在线翻译
QQ:19794405
agilelife分享群:59765983
QQ上少了,请大家加入msn group:
agilelife@groups.msn.com
敏捷项目实践经验分享
TDD,重构,迭代,结对
<
2008年5月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(7)
给我留言
查看公开留言
查看私人留言
我参与的团队
深圳Java俱乐部(0/0)
随笔分类
(15)
UI相关
好文翻译(1)
常用框架(1)
敏捷方法(4)
数据库相关
构架设计(2)
经验积累(3)
项目管理(4)
随笔档案
(55)
2008年12月 (1)
2008年7月 (2)
2008年5月 (8)
2008年3月 (1)
2008年2月 (4)
2007年10月 (1)
2007年9月 (4)
2007年7月 (3)
2007年5月 (2)
2007年4月 (6)
2007年3月 (5)
2007年2月 (2)
2007年1月 (3)
2006年11月 (3)
2006年10月 (1)
2006年8月 (1)
2006年7月 (1)
2006年5月 (2)
2006年4月 (2)
2006年3月 (3)
相册
rocket
搜索
积分与排名
积分 - 132665
排名 - 464
最新评论
1. re: 找了一天的jsp格式化工具,最后还是用回workshop
nb@2
--3
2. re: 一个以前没有注意的问题:java构造函数的执行顺序
不错,很有帮助
--王鹏飞
3. re: 一个新java web项目入手过程总结
标记一下。
--何杨
4. re: 单元测试究竟是测试什么?[未登录]
单元测试是在测逻辑,包括条件判定,循环等。博主的这段代码不包括任何逻辑,当然不需要用单元测试去覆盖。
--王辉
5. re: 找了一天的jsp格式化工具,最后还是用回workshop
傻逼
--2
阅读排行榜
1. 一个新java web项目入手过程总结(8491)
2. 一个以前没有注意的问题:java构造函数的执行顺序(8185)
3. 找了一天的jsp格式化工具,最后还是用回workshop(7367)
4. dwr reverse-ajax 实例解析(6589)
5. Spring+hibernate 单元测试框架总结(6224)
评论排行榜
1. 不仁义,不仗义(24)
2. 招聘java程序员,系统架构师(20)
3. dwr reverse-ajax 实例解析(11)
4. 找了一天的jsp格式化工具,最后还是用回workshop(10)
5. 单元测试究竟是测试什么?(10)