问个静态变量和实例变量执行顺序的问题

wangming402407250 2009-03-14 11:23:57
public class StaticVariableTest {
private static StaticVariableTest svt = new StaticVariableTest();//语句(1)
private int count1=5;//语句(2)
private static int count2=6;//语句(3)


private StaticVariableTest(){//语句(4)
count1++;
count2++;
}
public static StaticVariableTest getInstance(){//语句(5)
return svt;
}
public int getCount1() {
return count1;
}
public void setCount1(int count1) {
this.count1 = count1;
}
public static int getCount2() {
return count2;
}
public static void setCount2(int count2) {
StaticVariableTest.count2 = count2;
}
public static void main(String[] args) {
StaticVariableTest svt = StaticVariableTest.getInstance();//语句(6)
System.out.println("count1:" + svt.getCount1());//语句(7)
System.out.println("count1:" + svt.getCount2());//语句(8)
}
}
对比下面一个
public class StaticVariableTest {
private static StaticVariableTest svt = new StaticVariableTest();//语句(1)
private static int count1=5;//语句(2)
private static int count2=6;//语句(3)


private StaticVariableTest(){//语句(4)
count1++;
count2++;
}
public static StaticVariableTest getInstance(){//语句(5)
return svt;
}
public static int getCount1() {
return count1;
}
public static setCount1(int count1) {
StaticVariableTest.count1 = count1;
}
public static int getCount2() {
return count2;
}
public static void setCount2(int count2) {
StaticVariableTest.count2 = count2;
}
public static void main(String[] args) {
StaticVariableTest svt = StaticVariableTest.getInstance();//语句(6)
System.out.println("count1:" + svt.getCount1());//语句(7)
System.out.println("count1:" + svt.getCount2());//语句(8)
}
}

...全文
133 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
不善^ 2009-03-14
  • 打赏
  • 举报
回复
顺序:静态变量,实例变量

静态变量是类装载时就分配了空间,并且是共享的一段空间
main()方法 是静态的 所以先执行 main()
lijiefengjing 2009-03-14
  • 打赏
  • 举报
回复
9楼回答的够详细拉....
wangming402407250 2009-03-14
  • 打赏
  • 举报
回复
呵呵,我用jad反编译工具,果然是个好东西.实例变量在实例化前一定要初始化,但是静态变量与他们没有直接的关系
lingirl 2009-03-14
  • 打赏
  • 举报
回复
over了,我的脑袋瓜被你弄成糨糊了。。。
ZiSheng 2009-03-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wangming402407250 的回复:]
高手你是怎么知道编译器优化之后会出现你些的结果,又什么方法吗?谢谢
[/Quote]
如果你从类的生命周期,包括类的装载,连接,初始化,来解释,很麻烦。
你可以使用反编译工具 jad 看看。
wangming402407250 2009-03-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lingirl 的回复:]
因为static造成执行顺序不一样,结果当然也就不一样啊。
顺序:静态变量-》实例变量-》构造方法

第一个例子:
首先试图初始化静态变量svt,结果碰到了=后边的构造方法:new StaticVariableTest();
但是在构造方法执行之前必须先初始化实例变量count1,于是先跑去执行语句(2),于是count1=5;
之后回来继续执行构造方法,于是count1加1变成6,count2由0变成1;
接下来轮到语句(3),于是count2重新被赋值变成6; …
[/Quote]
以楼主顺序的话,构造函数是要实例化实例变量,但是实例化实例变量前,要先加载静态变量的啊?于是count1加1变成6,count2由6变成7;呵呵,麻烦解答下
wangming402407250 2009-03-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jimeshengxian 的回复:]
顺序:静态变量,实例变量
[/Quote]
是不能说明问题的,那你就吧我标在后面的顺序标出来肯定不能得到运行出来的结果.
lingirl 2009-03-14
  • 打赏
  • 举报
回复
因为static造成执行顺序不一样,结果当然也就不一样啊。
顺序:静态变量-》实例变量-》构造方法

第一个例子:
首先试图初始化静态变量svt,结果碰到了=后边的构造方法:new StaticVariableTest();
但是在构造方法执行之前必须先初始化实例变量count1,于是先跑去执行语句(2),于是count1=5;
之后回来继续执行构造方法,于是count1加1变成6,count2由0变成1;
接下来轮到语句(3),于是count2重新被赋值变成6;
在接下来语句(6)(7)(8)取值,打印,
所以结果:6,6

第二个例子:
不同的地方是,初始化静态变量svt,结果碰到了=后边的构造方法:new StaticVariableTest();时,不是再跑去先执行语句(2),因为此时的count1已经不是实例变量了,而是直接就去执行构造方法,于是count1,count2都由0变成了1。
接下来顺序执行语句(2)(3),于是count1,count2分别被重新赋值变成5,6
剩下的语句就是取值,打印
所以结果:5,6
jimeshengxian 2009-03-14
  • 打赏
  • 举报
回复
顺序:静态变量,实例变量
wangming402407250 2009-03-14
  • 打赏
  • 举报
回复
高手你是怎么知道编译器优化之后会出现你些的结果,又什么方法吗?谢谢
ZiSheng 2009-03-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wangming402407250 的回复:]
呵呵,可能楼上误解我的意思了.我就是想问一下为什么
public static int count1=5;
为什么有static没有它执行的结果会不一样?谢谢
[/Quote]
经过编译器优化之后,有没有static的区别不是很明显吗?
你的第一个例子不已经包含了两种情况,一种是有static(count2),一种没有static(count1),
这个清楚,第二题不就明白了
wangming402407250 2009-03-14
  • 打赏
  • 举报
回复
呵呵,可能楼上误解我的意思了.我就是想问一下为什么
public static int count1=5;
为什么有static没有它执行的结果会不一样?谢谢
ZiSheng 2009-03-14
  • 打赏
  • 举报
回复
把count1=5;放置在构造函数里边。
ZiSheng 2009-03-14
  • 打赏
  • 举报
回复
经过编译器的优化之后:

public class Test {
private static Test svt;
private int count1;
private static int count2;
static{
svt = new Test();//调用构造函数,此时,count1=6;count2=1;
count2=6;//
}

private Test(){//
count1=5;
count1++;
count2++;
}
wangming402407250 2009-03-14
  • 打赏
  • 举报
回复
哪位高手能够解答一下,第一题的输出是6,6执行的顺序是什么???

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧