`

java类的初始化顺序深究

 
阅读更多
package Test;

public class Test {
	private static Test tester = new Test(); // step 1
	private static int count1; // step 2
	private static int count2 = 333; // step 3

	public Test() { // step 4
		count1++;
		count2++;
		System.out.println(count1 + "\t" + count2);
	}

	public static Test getTester() { // step 5
		return tester;
	}

	public static void main(String[] args) {
	       //Test.getTester();
	
       }
}说明:

 

Test.getTester();这句话写和不写区别不大!

粗看这道题,感觉没什么,只是类加载顺序的问题。不过比较关键的一点是private static Test tester = new Test(); 

这段话把test这个对象给new出来了。牵一发而动全身,count1和count2也开始执行了。这就变得复杂些了。

一开始猜测运行答案:

1     334

程序的实际运行结果是:

1   1

好神奇的结果,想破脑袋都不太明白是怎么一回事。

最后查了下资料:

原来类加载的时候首先开辟了内存,然后赋予了默认的初始值。

也就是说count1和count2的内存首先被开辟出来了。

(具体是new Test()的时候开辟的,还是加载类的时候就开始开辟了,这需要再查下书!

  我的看法是:在new对象的时候才开辟了类里面的count1和count2的内存

)

明白了这个过程,我们就能够理解为什么结果是1 1了,那是因为先执行的这句

private static Test tester = new Test(); // step 1

,然后走的构造方法,因为count1和count2内存已经被开辟出来了,所以count1++ 结果是1,count2++结果也是1

如果我们在main方法里面,再输出一下下面这句话

System.out.println(count1 + "\t" + count2);

发现结果是1  333。

分析过程:

     程序执行完这句

private static Test tester = new Test(); 

就会走

private static int count1; // step 2
	private static int count2 = 333; // step 3
发现count1没有赋值动作,就执行count2,于是count1还是1,而count2就变成333

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics