面对开源的世界..
BlogJava
首页
新随笔
新文章
联系
聚合
管理
posts - 188,comments - 176,trackbacks - 0
<
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
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(13)
给我留言
查看公开留言
查看私人留言
随笔分类
(188)
Ajax(2)
Datestructure
DWR
Hibernate(5)
J2SE(5)
JavaScript
JavaServer(2)
JBS(22)
JSP/Servlet(13)
Junit(1)
Life(2)
Oracle(18)
protocol(1)
SEO
Spring(3)
SQLServer(7)
Struts(7)
UML(4)
Unix/Linux(11)
Windows(2)
WorkFlow(1)
XML(2)
互联网产品(26)
网络安全(3)
通信&政企产品(17)
通信业务(22)
需求分析(12)
随笔档案
(176)
2017年6月 (1)
2017年2月 (1)
2016年11月 (1)
2016年9月 (1)
2016年7月 (1)
2016年5月 (1)
2016年3月 (1)
2016年2月 (1)
2016年1月 (1)
2015年11月 (1)
2015年10月 (1)
2015年7月 (2)
2015年6月 (1)
2015年5月 (1)
2015年4月 (1)
2015年3月 (1)
2015年1月 (2)
2014年12月 (1)
2014年11月 (1)
2014年6月 (2)
2014年5月 (10)
2014年4月 (1)
2014年3月 (1)
2014年1月 (1)
2013年12月 (2)
2013年11月 (1)
2013年8月 (1)
2013年6月 (2)
2013年4月 (2)
2013年3月 (2)
2013年2月 (1)
2013年1月 (1)
2011年2月 (1)
2010年8月 (1)
2010年6月 (1)
2010年4月 (1)
2010年2月 (1)
2009年12月 (1)
2009年11月 (1)
2009年9月 (2)
2009年7月 (2)
2009年6月 (1)
2009年3月 (2)
2009年1月 (1)
2008年12月 (2)
2008年11月 (2)
2008年10月 (1)
2008年9月 (2)
2008年8月 (2)
2008年7月 (3)
2008年6月 (1)
2008年5月 (5)
2008年4月 (3)
2008年3月 (4)
2008年2月 (2)
2008年1月 (2)
2007年12月 (4)
2007年11月 (4)
2007年10月 (2)
2007年8月 (4)
2007年6月 (2)
2007年5月 (68)
强烈推荐
DBA Notes
JavaWorld
Java开源大全
OperaMasks.org
Oracle专栏
OSWorkflow
PL/SQL专栏
UML软件工程组织
XZC.Log
中间件技术论坛
俺的大巴
咖啡小驻
坚持到底
大宝sodme
徽剑评点
韩小明
最新随笔
1. 产品规划
2. 需求分析和判断
3. 谈谈产品工作过程
4. 谈谈产品工作中的项目管理
5. 产品重构那些事
6. 产品设计观
7. 产品修养
8. 前台 vs 中/后台产品设计
9. 2015产品感悟
10. 前端产品设计笔记
11. 无规则,不平台
12. 产品的生命周期体验
13. 产品软技能
14. 平台型产品的需求分析
15. 我所理解的产品思维
16. 平台产品的需求沟通与评审
17. 平台产品的竞品调研与业务分析
18. C端产品的那些事
19. 我理解的互联网产品经理
20. 通信与互联网产品工作感受
最新评论
1. re: 面对需求,我们的产品修养?[未登录]
互联网对产品人综合素质要求是比较高的
--linda
2. re: 谈谈前台、中/后台产品设计
产品的升级和更新换代都是这样的
--淘宝刷流量软件
3. re: 浅谈需求分析
看看技术人员的工作blog 学习了 慢慢看起来
--ttt
4. re: 2015产品感悟
大哥你的感悟真深邃。。。
--sqlyun
5. re: PLSQL中显式Cursor、隐式Cursor、动态Ref Cursor
有点乱
--sfe
6. re: 对session和cookie的一些理解[未登录]
session不能共享!!!!!!!!!!!!!
--jacky
7. re: 前端产品设计笔记[未登录]
产品用户体验很重要
--blog
8. re: 前端产品设计笔记
@java论坛
赞同
--cheng
9. re: 前端产品设计笔记
我觉得最重要的是用户群是什么以及如何获取用户,把这个想清楚放到设计中才是成功的开始
--java论坛
10. re: 无规则,不平台
评论内容较长,点击标题查看
--性感美女图片
阅读排行榜
1. 对session和cookie的一些理解(40837)
2. PLSQL开发笔记和小结(35759)
3. ORACLE批量更新三种方法比较(11455)
4. Oracle的悲观锁和乐观锁(8070)
5. PLSQL中显式Cursor、隐式Cursor、动态Ref Cursor(7851)
评论排行榜
1. 对session和cookie的一些理解(30)
2. Struts+Hibernate实现shopcart(16)
3. PLSQL开发笔记和小结(14)
4. BaseAction的java多态思考(11)
5. UML中的用例图分析(10)
对象初始化流程梳理
类Person和子类Son,体现对象初始化流程的代码:
public
class
Person
{
Bow b1
=
new
Bow(
1
);
static
{
System.out.println(
"
Person static
static块1
"
);
}
{
System.out.println(
"
Person hello
非static块1
"
);
}
Bow b2
=
new
Bow(
2
);
static
Bow b3
=
new
Bow(
3
);
Person()
{
System.out.println(
"
Person
Person类的构造器
"
);
}
{
System.out.println(
"
Person hello
非static块2
"
);
}
static
{
System.out.println(
"
Person static
static块2
"
);
}
}
class
Son
extends
Person
{
Bow b4
=
new
Bow(
4
);
static
{
System.out.println(
"
Test static
static块1
"
);
}
{
System.out.println(
"
Test hello1
非static块1
"
);
}
Bow b5
=
new
Bow(
5
);
static
Bow b6
=
new
Bow(
6
);
Son()
{
System.out.println(
"
Test
Test类的构造器
"
);
}
{
System.out.println(
"
Test hello2
非static块2
"
);
}
static
{
System.out.println(
"
Test static2
static块2
"
);
}
public
static
void
main(String[] args)
{
System.out.println(
"
main
"
);
new
Son();
}
}
class
Bow
{
Bow(
int
m)
{
System.out.println(
"
Bow(
"
+
m
+
"
)
"
);
}
}
执行结果:
Person static...static块1
Bow(3)
Person static...static块2
Test static...static块1
Bow(6)
Test static2...static块2
main...
Bow(1)
Person hello...非static块1
Bow(2)
Person hello...非static块2
Person...Person类的构造器
Bow(4)
Test hello1...非static块1
Bow(5)
Test hello2...非static块2
Test...Test类的构造器
从上面结果,可以总结出JAVA对象初始化的流程:
【1】父类static块和父类static属性(两者的执行先后顺序依据它们在类中具体位置由上至下)
【2】子类static块和子类static属性(两者的执行先后顺序依据它们在类中具体位置由上至下)
【3】执行main方法中new关键字之前的代码块
【4】父类非static块执行和父类非static属性(两者的执行先后顺序依据它们在类中具体位置由上至下,如果属性为实例类型,则执行该实例所在类的非static块和非static属性,再执行该类的构造器,即[4][5]步骤)
【5】父类构造器(完成非static
属性初始值
的设置)
【6】子类非static块执行和子类非static属性(两者的执行先后顺序依据它们在类中具体位置由上至下,如果属性为实例类型,则执行该实例所在类的非static块和非static属性,再执行该类的构造器,即[6][7]步骤)
【7】子类构造器(完成非static属性初始值设置,如果在子类构造器执行前就返回该非static属性,则该非static属值为
属性默认值
)
注:
针对第【7】点“子类构造器执行前就返回该非static属性”,具体可以见下例:
public
class
ParentObjectInit
{
public
void
test()
{
}
public
ParentObjectInit()
{
test();
}
}
class
ChildObjectInit
extends
ParentObjectInit
{
private
int
instanceValue
=
20
;
public
void
test()
{
System.out.println(
"
instance1 value :
"
+
instanceValue);
}
public
static
void
main(String[] args)
{
new
ChildObjectInit();
}
}
这段代码的执行结果:
instance1 value is: 0 因为new 子类ChildObjectInit时,会先初始化父类ParentObjectInit,继而调用父来构造器器,接着执行此构造器中的test()方法,基于多态性,会转而调用子类的test()方法执行子类test()方法代码体,打印出instanceValue的属性默认值。(因为此时打印instanceValue值后,父类构造器才执行结束返回,根本还没轮到子类的初始化工作和子类构造器的执行。)
posted on 2008-05-24 21:26
cheng
阅读(2189)
评论(3)
编辑
收藏
所属分类:
JBS
FeedBack:
#
re: 对象初始化流程梳理
2008-05-25 15:12 |
隔叶黄莺
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: 对象初始化流程梳理
2008-05-26 14:32 |
cheng
看过楼上朋友见解,体会又深一层,谢谢。
回复
更多评论
#
re: 对象初始化流程梳理
2008-05-26 14:32 |
Happy漫步者
不错 收藏了
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
对象初始化流程梳理
static、this、super、final用法
String对象的理解进行时
对象初始化问题引发的思考
在Java应用程序中访问USB设备
Java中的类反射机制
Java代码编写30条建议
Java动态的程序设计
为什么Java中继承是有害的
对象引用对GC的影响