前面理解过java实例变量的初始化规则 朝花夕拾——看清java实例变量的初始化内幕
今天继续理清类变量的初始化顺序和细节,需要的朋友可以一起温习下。
类变量的初始化和实例变量的初始化很相似,相比实例变量初始化,少了构造器初始化的情况。大致只有:定义类变量时初始化和静态块中初始化两种情况。
规则:上述两种情况下,先对所有类变量进行申明并申请内存,在把赋值操作全部移动到静态块中进行初始化,顺序和源代码顺序一致。
首先理解下面代码
static double number = 100;
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); } }
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工具查看编译器源码,图下图
两种情况下的静态块赋值情况(左边为上述第二种源代码,右边为上述第一种源代码)
到此,类变量的初始化大致如上述。
原文地址:http://blog.csdn.net/u010794180/article/details/43406105