首页 > 代码库 > 朝花夕拾——再看java类变量的初始化内幕

朝花夕拾——再看java类变量的初始化内幕

前面理解过java实例变量的初始化规则 朝花夕拾——看清java实例变量的初始化内幕

今天继续理清类变量的初始化顺序和细节,需要的朋友可以一起温习下。

类变量的初始化和实例变量的初始化很相似,相比实例变量初始化,少了构造器初始化的情况。大致只有:定义类变量时初始化和静态块中初始化两种情况。

规则:上述两种情况下,先对所有类变量进行申明并申请内存,在把赋值操作全部移动到静态块中进行初始化,顺序和源代码顺序一致。

首先理解下面代码

static double number = 100;

实际上JVM处理上述语句等价于

static double number;
static{
	number = 100;
}

按照上述规则,给出完整例子

public class TestStatic {
	
	
	static double number = 100;


	static{
		System.out.println("number = "+ number);
		count = 200;
	}
	
	static double count = 300;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("number = "+ number);
		System.out.println("count = "+ count);

	}

}

按照规则,首先把double类型的number和count进行申明并申请内存(内存申请不做说明),并执行等价代码块和原来代码块,上述代码等价于下面代码

public class TestStatic {
	
	
	//static double number = 100;
	static double number;
	static double count;
	static{
		number = 100;
	}
	
	static{
		System.out.println("number = "+ number);
		count = 200;
	}
	
	//static double count = 300;
	static{
		count = 300;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("number = "+ number);
		System.out.println("count = "+ count);

	}

}

利用javap工具查看编译器源码,图下图

技术分享

两种情况下的静态块赋值情况(左边为上述第二种源代码,右边为上述第一种源代码)


技术分享

到此,类变量的初始化大致如上述。

朝花夕拾——再看java类变量的初始化内幕