JiveJdon Community Forums
在线371人   首页   主题表   培训咨询   标签   精华   查搜   注册    登陆 RSS
首页 » 论坛 » J2EE/JavaEE/JEE/EJB/JSF等技术讨论
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表
???en_US.forumThreadNext.name??? 下一主题
Go 总共有 3 回复 / 1
 发表新帖子   回复该主题贴
jacobzheng

悄悄话
发表文章: 4
注册时间: 2004年09月13日 17:52
关于java的初始化顺序 2004年12月07日 17:44 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
标签列表 java学习(89)     
最近在研究java基础,对于java初始化的顺序一直没有搞清楚,找了很多资料和文章也还是依然费解。于是决定,自己研究,终于在一个小风嗖嗖的晚上搞清楚了order of initialization,现在分享给大家!
第一步:find class:这个时候jvm会找寻.class文件,.class像个产品的磨具一样,是用来产生object产品的而不是.class本身。
第二步:create object class:往往很少有人注意到这点,这也是一个oject也同样占用内存资源可是和传统意义上的object不一样,他是一个类似于磨具的东西,可和object一样占用空间。在第二步的时候我们会看到static field的东西得到了初始化,所以说static 的东西是属于类对象而不是属于对象的。当.class第一次被导入的时候,被static修饰过的东西也随之allocate。所以我们能够有Class2.classField/Class2.classMethod的写法,这些东西是只占用一块内存空间的和new instance 没有任何关系。对于没有被static修饰过的field就属于instance field了,这个时候obj.classField/obj.classMethod的写法就产生了,他们和new instance 由某种惟妙惟肖的关系。
第三步:Definition initializaiont:这个时候程序会做一些定义初始化的动作,比如class类里面的field的初始化。
最后一步:Construction initialization:这个地球人都知道了,我就不说了。

下面是一个例子,看看是否和你的想象一样。
class Cup
{
Cup(int marker)
{
System.out.println("Cup(" + marker + ")");
}
void f(int marker)
{
System.out.println("f(" + marker + ")");
}
}
class Cups
{
static Cup c1=new Cup(1);
Cup c3=new Cup(3);
static Cup c2= new Cup(2);
Cups()
{
System.out.println("Cups()");
}
Cup c4=new Cup(4);
}
public class ExplicitStatic
{
Cups c=new Cups();
{
System.out.println("Hello");
}
public static void main(String[] args)
{
System.out.println("Inside main()");
Cups.c1.f(99);
ExplicitStatic x=new ExplicitStatic();
}
static Cups x = new Cups();
}

大家可以手动执行一下这个程序,考虑一下结果是什么,然后参照下面的答案对照一下,看看是否正确:
Cup(1)
Cup(2)
Cup(3)
Cup(4)
Cups()
Inside main()
f(99)
Cup(3)
Cup(4)
Cups()
Hello
因为Static是属于类对象的所以,只初始化一次。也正是因为Static是属于类对象的所以,先处理被Static修饰过的东西。

Plus:
class field:共用一块内存
class method:共用一块内存
instance field:随着每个instance各有一块内存
instance method:共用一块内存(_! why?)
JVM为了节省空间,所以
instance1.instanceMethod();
instance2.instanceMethod();
编译器会吧instance1和instance2作为instanceMethod()的一个隐藏的参数传入方法内(当然我们是看不到了)。这个东东就是我们常常说的this。用这种方法来区分是哪一个instance来调用方法,哎Gosling就是聪明。
ilsummer

悄悄话
发表文章: 1
注册时间: 2004年12月08日 10:18
Re: 关于java的初始化顺序 2004年12月08日 10:20 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
看不太懂的说………………
kxhu

悄悄话
发表文章: 1
注册时间: 2004年12月08日 11:14
Re: 关于java的初始化顺序 2004年12月08日 11:24 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
执行new Instance之后进入构造函数。
Definition initializaiont是由Construction initialization调用的
jacobzheng

悄悄话
发表文章: 4
注册时间: 2004年09月13日 17:52
Re: 关于java的初始化顺序 2004年12月08日 22:32 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
可是为什么Definition initializaiont在Construction method之前被调用呢?
这个主题有 3 回复 / 1Go
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表    返回页首返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache 缓存 DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Seam Spring Struts
正在读取,请等待...
google yahoo 新浪ViVi 365Key网摘 天极网摘 CSDN网摘 添加到百度搜藏 POCO网摘 博采网摘
查询本论坛内 回复超过的热门帖子
     回复该主题贴
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
  发贴前查询 标签列表勿重复发表问题

RSS 手机阅读 add to google add to yahoo
解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-08 jdon.com
anti spam