这是以前整理出来的,编写框架代码的时候,在类初始化的过程中,碰到了说一静态变量为null。这里有篇文章不错,下面有连链接,我自己也总结了一下,贴出来。
public class InitTest {
// 变量
public String field = "变量";
//静态变量并初始化
public static InitTest initTest = new InitTest();
// 静态变量
public static String staticField = "静态变量";
// 静态初始化块
static {
System.out.println(staticField);
System.out.println("静态初始化块");
}
// 初始化块
{
System.out.println(field);
System.out.println("初始化块");
}
// 构造器
public InitTest() {
System.out.println("构造器中:"+staticField);
System.out.println("构造器");
}
public static void testStaticMethod(){
System.out.println("静态方法");
}
public static void main(String[] args) {
testStaticMethod();
}
}
输出结果:变量、初始化块、构造器中:null、构造器、静态变量、静态初始化块、静态方法
备注:类初始化顺序:静态变量、静态块、静态方法。静态变量、静态块取决于它们在类中出现的先后顺序。先是类初始化,然后对象实例化
问题:在静态变量中初始化对象,会先初始化对象,即如上顺序变量、初始化块、构造器,然后初始化剩余的静态变量、或者块,这时如果在初始化块、构造器引用了剩余的静态变量,那静态变量就是为空。
分析原因为:类的初始化在在首次主动使用时
可以见文章http://www.ibm.com/developerworks/cn/java/j-lo-clobj-init/index.html
<!--[endif]-->
类的初始化时机就是在"在首次主动使用时",包括一下情况:
<!--[if !supportLists]-->· <!--[endif]-->创建某个类的新实例时--new、反射、克隆或反序列化;
- 调用某个类的静态方法时;
- 使用某个类或接口的静态字段或对该字段赋值时(final字段除外);
- 调用Java的某些反射方法时
- 初始化某个类的子类时
在虚拟机启动时某个含有main()方法的那个启动类。