执行顺序
- 静态块
- 静态域
- 静态⽅法
- 非静态域
- 非静态块
- 非静态⽅法
- 构造⽅法
先执⾏静态部分,再执⾏非静态部分。如果在静态部分中有构造⽅法。则先执⾏非
静态部分(非静态部分先执⾏非静态代码块,再执⾏构造⽅法),再执⾏剩余的静态部分。
相同级别的执⾏顺序是按照代码顺序执⾏。
静态⽅法只执⾏⼀次,非静态⽅法每次创建对象就会执⾏⼀次
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");
//静态块
static {
print("静态块");
n=100;
}
private static int n = 99;
//构造块
{
print("构造块");
j=100;
}
public InitializeDemo(String str) {
System.out.println((k++) + ":" + str + " i=" + i + " n=" + n);
++i;
++n;
}
private int j = print("j");
public static int print(String str) {
System.out.println((k++) + ":" + str + " i=" + i + " n=" + n);
++n;
return ++i;
}
public static void main(String[] args) {
InitializeDemo n = new InitializeDemo("初始化");
}
}
执行结果:
1:构造块 i=0 n=0
2:j i=1 n=1
3:t1 i=2 n=2
4:构造块 i=3 n=3
5:j i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:静态块 i=7 n=7
9:构造块 i=8 n=99
10:j i=9 n=100
11:初始化 i=10 n=101
执行顺序
- 第一部分
public static void main(String[] args) {
InitializeDemo n = new InitializeDemo("初始化");
}
InitializeDemo n
意味着这个程序开始执行,所以紧接着会开始执行静态部分,
(1)private static int k = 1;
初始化k的值为1
(2)随后private static InitializeDemo t1 = new InitializeDemo("t1");
此语句创建了一个对象,会跳过静态部分,先执行非静态部分(非静态部分则会先执行非静态代码块,再执行构造方法)所以执行构造块{ print("构造块"); j=100; }
(3)因为print("构造块");
,所以开始调用print方法。又因为程序只初始化到了private static InitializeDemo t1 = new InitializeDemo("t1");
,而后面的i和n没有初始化,i和n自动为0。输出结果
(4)然后private int j = print("j");
,再一次调用print方法,输出结果
(5)第一次非静态部分执行完毕,开始执行new InitializeDemo("t1");
,调用InitializeDemo方法,输出结果
2.第二部分
执行private static InitializeDemo t2 = new InitializeDemo("t2");
,与第一部分类似
(在程序中j=100;
"100"没有实际作用)
输出结果
-
第三部分
(1)开始执行private static int i = print("i");
,继续调用print方法,输出结果随后执行static { print("静态块"); n=100; }
(2)依旧先是print("静态块")
调用print方法,然后n再由n=100;
定义为private static int n = 99;
,最后执行private static int i = print("i");
,输出结果
(4)最后执行private int j = print("j");
输出结果 -
第四部分
程序中,静态部分全部执行完成,开始执行new InitializeDemo("初始化");
,调用InitializeDemo方法,输出结果
程序完成