public class InitializeDemo {
private static int k = 1;
private static InitializeDemo t1 = new InitializeDemo("t1");
private static InitializeDemo t2 = new InitializeDemo("t2");
private static int i = print("i");
private static int n = 99;
static {
print("Static Module");
}
private int j = print("j");
{
print("Constructive Module");
}
public InitializeDemo(String str) {
System.out.println((k++) + ":" + str + " i=" + i + " n=" + n);
++i;
++n;
}
public static int print(String str) {
System.out.println((k++) + ":" + str + " i=" + i + " n=" + n);
++n;
return ++i;
}
public static void main(String args[]) {
new InitializeDemo("init");
}
}
Output is:
1:j i=0 n=0
2:Constructive Module i=1 n=1
3:t1 i=2 n=2
4:j i=3 n=3
5:Constructive Module i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:Static Module i=7 n=99
9:j i=8 n=100
10:Constructive Module i=9 n=101
11:init i=10 n=102
Principles:
1.静态属性和静态代码块都是在类加载的时候初始化和执行, 两者的优先级别是一致的, 且高于非静态成员, 执行按照编码顺序。
2.非静态属性和匿名构造器在所有的构造方法之前执行, 两者的优先级别一致, 执行按照编码顺序。
3.以上执行完毕后执行构造方法中的代码。
(静态属性=静态代码块)> (非静态属性 = 构造块)> 构造方法
Summary:
1.静态只在类加载的时候执行,且仅执行一次。
2.非静态只在实例化的时候执行,且每次实例化都执行。
3.静态在非静态之前执行。
4.静态属性和静态块的执行顺序取决于编码顺序,对它们一视同仁。
5.非静态属性和构造块的执行顺取决于编码顺序,对它们也一视同仁。
6.最后执行构造方法。