也谈谈Java中的static块

我们都知道,static 块在初始化的时候,首先执行  static 块区域,然后执行相应的构造方法

package C01;

import java.util.List;
import java.util.ArrayList;

public class TestStatic {
	
	private static List list ;
	
	//静态初始化区
	static {
		list = new ArrayList();
		list.add("测试1");
		list.add("测试2");
	}
	

	public TestStatic(){
		init();
	}
	
	public void print(){
		for(int i = 0;i<list.size();i++){
			System.out.println(list.get(i));
		}
	}
	
	private void init(){
		if(null==list){
			list = new ArrayList();
		}
		list.add("测试0");
	}

	
	public static void main(String args[]){
		TestStatic ts = new TestStatic();
		ts.print();
	}
}



上面的代码输出为
测试1
测试2
测试0
这个认为是正常的,但是,问题出在下面,当我把这个类改写成单例的时候。

package C01;

import java.util.List;
import java.util.ArrayList;

public class TestStatic {

	
	private static final TestStatic instance = new TestStatic();
	
	private static List list ;
	
	//静态初始化区
	static {
		list = new ArrayList();
		list.add("测试1");
		list.add("测试2");
	}
	

	private TestStatic(){
		init();
	}
	
	public void print(){
		for(int i = 0;i<list.size();i++){
			System.out.println(list.get(i));
		}
	}
	
	private void init(){
		if(null==list){
			list = new ArrayList();
		}
		list.add("测试0");
	}
	
	public static TestStatic getInstance(){
		return instance;
	}
	
	public static void main(String args[]){
		TestStatic.getInstance().print();
//		TestStatic ts = new TestStatic();
//		ts.print();
	}
}


这次输出的是
测试1
测试2

重结果上来看list.add("测试0");好像没有执行。
后来经过打注视调试,发现了问题的所在。
是static块在作怪

修改一下代码
package C01;

import java.util.List;
import java.util.ArrayList;

public class TestStatic {

	
	private static final TestStatic instance = new TestStatic();
	
	private static List list ;
	
	//静态初始化区
	static {
		list = new ArrayList();
		list.add("测试1");
		list.add("测试2");
		System.out.println("static block is called !");
	}
	

	public TestStatic(){
		init();
		System.out.println("TestStatic is called !");
	}
	
	public void print(){
		for(int i = 0;i<list.size();i++){
			System.out.println(list.get(i));
		}
	}
	
	private void init(){
		if(null==list){
			list = new ArrayList();
		}
		list.add("测试0");
		System.out.println("init is called !");
	}
	
	public static TestStatic getInstance(){
		return instance;
	}
	
	public static void main(String args[]){
		TestStatic.getInstance().print();
//		TestStatic ts = new TestStatic();
//		ts.print();
	}
}
这次输出的是:

init is called !
TestStatic is called !
static block is called !
测试1
测试2
问题出现在第三行”static block is called !“
static 块并没有 在构造方法前执行
static 块执行的时候覆盖掉了已经初始化的list,重新创建了一个实例。
getInstance 方法 强迫了 instance 初始化,构造方法,抢先了static块。

你可能感兴趣的:(java)