今天在论坛中看到一个帖子,说面试看到这么一道题:
public class Test {
public static Test t = new Test();
public static int a;
public static int b = 0;
Test() {
a++;
b++;
}
public void printAB() {
System.out.println(a + "," + b);
}
/**
* @param args
*/
public static void main(String[] args) {
new Test().printAB();
}
}
实际运行之后是 2,1
想了半天也想不明白是为什么。看楼下的解释也不知道什么意思。
debug之后发现,其运行顺序是这样的:
1、运行22行的new,创建对象。
2、第三行创建对象时,因为Test中的a和b都是static的,所以,对a和b进行初始化。
3、因为有b=0的语句,所以将0赋值给b。
4、进入构造方法,a和b的值自增。
5、t 的创建就好了。继续,因为a已经被初始化过一次,所以不再进行初始化动作。而b=0是赋值语句,所以b的值再次变为0。此时a=1,b=0;
6、进入构造方法创建对象,自增。
7、打印a和b的值。出来的结果就是2和1了。
也就是说:运行顺序,按照行号:22-3-5-7-10-11-7-10-11-15。也就说:b=0运行了2次。
结合帖子中的说法,static int a ;是初始化,JVM只会初始化1次。已经初始化过的不再进行初始化。b=0是赋值语句,每次运行到这都会重新赋值一次。
原帖:http://bbs.csdn.net/topics/390792285
=======2019-08-31================================
今天又测试了一下,用JDK1.6/1.7/1.8分别运行,结果都是2,2
当时写博客的时候也没有记录什么环境运行的,不知道为啥当时运行结果和现在不一样。有点郁闷。
估计和类加载器有关系。我也懒得再研究了。