JAVA初始化/静态块/构造块
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("初始化");
}
}
运行结果:
运行顺序:
第一部分
首先执行语句:
public static void main(String[] args) {
InitializeDemo n = new InitializeDemo(“初始化”);
}
1. 因为InitializeDemo n
是一个引用,所以紧接着会开始执行静态部分:private static int 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");
public static int print(String str) {
System.out.println((k++) + ":" + str + " i=" + i + " n=" + n);
++n;
return ++i;
}
因为构造块处没有东西接收return所以return在此处没多大作用。此步运行结果为:
5.然后执行 private static InitializeDemo t1 = new InitializeDemo("t1");
调用
public InitializeDemo(String str) {
System.out.println((k++) + ":" + str + " i=" + i + " n=" + n);
++i;
++n;
}
此方法,输出结果:
第二部分
运行 private static InitializeDemo t2 = new InitializeDemo("t2");
运行方式与第一部分相同
输出结果:
第三部分
运行 private static int i = print("i");
执行print方法输出结果:
之后运行静态块用到print方法运行结果:
运行完之后n被赋值100,因为private static int n = 99;
n又被赋值为99,(静态部分加载完全)。
第四部分
先运行new InitializeDemo("初始化");
先加载构造块,运行print方法输出结果:
运行 private int j = print("j");
运行结果:
最后运行
public InitializeDemo(String str) {
System.out.println((k++) + ":" + str + " i=" + i + " n=" + n);
++i;
++n;
}
构造方法输出结果: