在线371人
首页
主题表
培训咨询
标签
精华
查搜
注册
登陆
用户
自动登陆
密码
新用户注册
忘记密码?
首页
»
论坛
»
J2EE/JavaEE/JEE/EJB/JSF等技术讨论
上一主题
我想下载一些教程,但不知成为VIP需要支付多少银子?
返回本主题
返回主题列表
下一主题
哪为好心的高手请写一下JPETSTORE在tomcat5.0 sql2000下的配置步骤
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
回复 /
1
页
Go
上一主题
返回本主题
返回主题列表
返回页首
下一主题
热点TAG:
AOP
cache
缓存
DDD
EJB
集群
设计模式
Hibernate
IOC
JiveJdon
OO
RBAC
Seam
Spring
Struts
正在读取,请等待...
Wowzio
grab this
·
technology
blog
查询本论坛内
近一天
近三天
近一周
近一月
近三月
近半年
近一年
所有
回复超过
的热门帖子
标题
内容
发贴前查询
标签列表
勿重复发表问题
解惑之道在
J道
,打造中国最具影响力的的企业软件社区
OpenSource
JIVEJDON
v3.0
Powered by
JdonFramework
Code © 2002-08
jdon.com
anti spam