类的静态变量初始化
例:
public class Test {
private static int a = 0;
private static Test t = new Test();
private static int b = 0;
private Test() {
a++;
b++;
System.out.println("构造方法内:a="+a);
System.out.println("构造方法内:b="+b);
}
public static void main(String[] args) {
System.out.println("main:a="+Test.a);
System.out.println("main:b="+Test.b);
}
}
先猜猜运行结果 ? (1,1,1,1)
//正确的运行结果
构造方法内:a=1
构造方法内:b=1
main:a=1
main:b=0
分析
类加载过程: 加载->连接->初始化->使用->卸载;
重点说下连接和初始化两个阶段:
连接阶段分为:
验证: 校验字节码,确保被加载的类的正确性和安全性。
准备: 为类变量分配内存,设置默认值,但是在到达初始化之前,类变量都没有初始化为正确的初始值.
解析:在常量池中寻找类、接口、字段和方法的符号引用,并替换为直接引用的过程.
初始化:为类变量赋予正确的初始值。
类的静态变量的初始化顺序:从上至下!
//1 执行main方法,
public static void main(String[] args) {
System.out.println("main:a="+Test.a);
System.out.println("main:b="+Test.b);
}
//2 加载 Test类
//2.1 忽略其他步骤,直接看 '连接' 的 '准备'阶段
private static int a = 0; //设置 为0,
private static Test t = new Test(); //设置 为null
private static int b = 0; //设置 为0 (*)
//2.2 初始化 阶段
private static int a = 0;//赋值 为0
private static Test t = new Test();//执行 new Test();
//调用构造方法 执行如下:
private Test() {
a++;//在赋值为0后,加1,为1
b++;//在(*)这步后,加1,为1
//所以接下来输出为 1,1
System.out.println("构造方法内:a="+a);
System.out.println("构造方法内:b="+b);
}
private static int b = 0;//赋值 b=0;(b->1->0)
//3 回到main方法
//输出 1,0
结尾
有不对之处,欢迎指正.