日期:2014-05-20  浏览次数:20670 次

一个比较疑惑的问题

public class test {

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
new A();
new A();
new A();
}
}
class A
{
public final static A a=new A();
static int b=0;
A()
{
System.out.println("我初始化了");
System.out.println(b);
b++;
}
}

控制台显示:

我初始化了
0
我初始化了
0
我初始化了
1
我初始化了
2
请问public final static A a=new A();
是什么时候运行的?为什么会有2个0?这段代码具体是怎么运行的?球高手帮个忙谢谢~!!

------解决方案--------------------
我的理解是:
你开始java 包名.test时,加载test类, 然后执行test类里第一个new A(),此时加载类A,类A里的所有static属性缺省初始化、然后第一个static属性显示初始化(第2个static属性仍缺省初始化,b是0),执行public final static A a=new A(); 里的new A();因为new A(),所以调构造A(){},b打印出b的缺省值0,然后b++,变成1,构造执行完毕,回来执行到类A的第2个static属性b显示初始化,这时,就把刚才b++变成1的值擦掉了,b重新变成0,所以打印的值是0,完毕。
现在回到test类,执行第2个new A(),因为刚才已经加载了类A,就不再加载了,直接执行构造A(){},打印的值是1,
------解决方案--------------------
先初始化类的静态域
public final static A a=new A(); 

我初始化了 


A() X3 

System.out.println("我初始化了"); 
System.out.println(b); 
b++; 



我初始化了 

我初始化了 

我初始化了 




------解决方案--------------------
很简单..为什么会有两个 .

Java code
我初始化了
0