欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA静态代码块

程序员文章站 2022-06-07 13:06:18
...

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

代码如下:

 

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
				+ "]";
	}
}

 

运行结果如下:


JAVA静态代码块
            
    
    博客分类: java  
 

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

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有值。

  • JAVA静态代码块
            
    
    博客分类: java  
  • 大小: 63.4 KB