`

JAVA静态代码块

    博客分类:
  • java
阅读更多

今天遇到下面的代码,感觉很奇怪,特意记录下:

代码如下:

 

public class Test {
	private static List<Test> objs = new ArrayList<Test>();
	
	static {
		objs.add(new Test(Test.S_NAME,Test.NAME,Test.COUNT));
		objs.add(new Test(Test.S_NAME,Test.NAME,Test.COUNT));
	}
	
	private final static String S_NAME = "aaa";
	private final static String NAME = new String("bbb");
	private final static Long COUNT = 1l;
	
	private String name;
	private String title;
	private Long count;
	
	public Test(String name,String title,Long count) {
		this.name = name;
		this.title = title;
		this.count = count;
	}
	
	public static void main(String[] args) {
		System.out.println(objs);
		
	}

	@Override
	public String toString() {
		return "Test [name=" + name + ", title=" + title + ", count=" + count
				+ "]";
	}
}

 

运行结果如下:



 

感觉到特别奇怪,特意解释下:

1,静态变量声明和初始化是两个过程; 

2, String字面常量有个pool, 每次有新的常量出现的时候, 先把它放入pool, 然后直接把变量引用指向pool中的位置;

3. java中的字面常量在编译的时候被替换成真实的值,具体表现为字符串常量和基本类型常量。

4, static 块java language specification是保证happen before的,也就是有顺序的。

 所以代码等同于:

 

private static List<Test> objs = null;

	private final static String S_NAME = "aaa"; //String pool.

	private final static String NAME = null;

	private final static Long COUNT = null;

	static {

	    objs =  new ArrayList<Test>();

		objs.add(new Test(Test.S_NAME,Test.NAME,Test.COUNT));

		objs.add(new Test(Test.S_NAME,Test.NAME,Test.COUNT));

		NAME = = new String("bbb");

		COUNT =  = 1l;

}

 

    这样就很好理解了。变量的声明和初始化是两个过程,这样就能理解NAME为什么是null了,而S_NAME有值。

  • 大小: 63.4 KB
1
0
分享到:
评论
2 楼 asialee 2015-07-14  
欢迎讨论,说说你的想法
1 楼 zizige09 2015-07-09  
对解释部分没看太明白,这个对象在被主动调用的时候,会初始化这个类,而类的初始化也就是初始化静态字段,static段也是在这个时候被一同执行,而且static段的声明比字段的声明靠前,也就是会先执行static段,所以在执行的时候就是null了

相关推荐

Global site tag (gtag.js) - Google Analytics