1.先了解static
- 归类所有,只初始化一次,并且当类加载的时候才开始初始化
- 修饰变量 所有该类的对象共享一个静态变量
- 修饰方法 直接用类名调用即可
- 能不能在main方法内写static int a =3;? 不能
2.大乱斗(了解这道题,即明白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");
private static int n = 99;
{
print("初始化块");
j=100;
}
public InitializeDemo(String str) {
System.out.println((k++) + ":" + str + " i=" + i + " n=" + n);
++i;
++n;
}
static {
print("静态块");
n=100;
}
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) {
System.out.println("aaaa");
InitializeDemo test = new InitializeDemo("test");
}
}
- 首先要先加在main所在类中所有静态
- 执行 private static int k = 1;静态量
- 先执行InitializeDemo test = new InitializeDemo(“t1”);,之后加载类,先加载静态量和静态块
- 再执行 private static InitializeDemo t1 = new InitializeDemo(“t2”);静态量
- 因为在初始化了该类,所以执行初始化块和构造方法
- { print(“初始化块”); j=100;}
- 然后执行private int j = print(“j”);
- 在执行构造函数
- 挨个执行每条静态语句
- 当 执行完private static int n = 99;后该执行静态块
- 然后是初始化块,再是 private int j = print(“j”);最后只执行构造函数
- 最后执行main中,InitializeDemo test = new InitializeDemo(“test”);
- 流程结束
注意一定先是初始化main所在类的静态,然后再执行main
结果: