JAVA类的初始化顺序(静态变量,静态模块,变量,模块,构造器)
???????????对于静态变量,与类变量及构造器初始化顺序的朋友们,大家看过来了,阅读了以后几段代码之后,你会发现原来也就是这么简单.先看下面这几个类.
??
/**类A**/public class TestA { public TestA(String a){ System.out.println(a); }}/**类B**/public class TestB { public TestB(String b){ System.out.println(b); }}/**类 Parent **/public class Parent { private static TestA testA1 = new TestA("Parent的静态变量"); static { System.out.println("Parent的静态初始化模块"); } private TestA testA2 = new TestA("Parent变量"); { System.out.println("Parent的初始化模块"); } public Parent(){ System.out.println("Parent的构造函数"); }}/**Parent的子类SubClass**/public class SubClass extends Parent{ private static TestA testA1 = new TestA("SubClass的静态变量1"); static { System.out.println("SubClass的静态初始化模块1"); } private static TestA testA2 = new TestA("SubClass的静态变量2"); static { System.out.println("SubClass的静态初始化模块2"); } private TestA testA3 = new TestA("SubClass变量1"); { System.out.println("SubClass的初始化模块1"); } private TestA testA4 = new TestA("SubClass变量2"); { System.out.println("SubClass的初始化模块2"); } public SubClass(){ System.out.println("SubClass的构造函数"); } public static void main(String[] args) { SubClass subClass = new SubClass(); }}?
打印结果如下:
??? Parent的静态变量
??? Parent的静态初始化模块
??? SubClass的静态变量1
??? SubClass的静态初始化模块1
??? SubClass的静态变量2
??? SubClass的静态初始化模块2
??? Parent变量
??? Parent的初始化模块
??? Parent的构造函数
??? SubClass变量1
??? SubClass的初始化模块1
??? SubClass变量2
??? SubClass的初始化模块2
??? SubClass的构造函数
?说明?:
1.静态变量与静态模块是最先初始化的,因为它是属于类的变量和模块.
2.Parent的构造器要先于它的子类,这一点是肯定的,但Parent的变量,初始化模块要先于它的子类,这一点可能理解起来有点困难,但我们只要知道父类的构造器先于子类,它的变量与模块也是理所当然的,这样理解起来会比较合理.
3.静态变量与静态模块的初始化顺序是根据在类里面定义的顺序,同理变量化初始化模块的顺序也是根据类里面定义的顺序(上面结果的红色部门)
1 楼 C_J 2009-04-17 我觉得你的总结有些偏差