在类进行加载的时候分为三个大的阶段,加载,链接,初始化。其中链接又分为,验证,准备,解析。
类变量(静态变量)是在准备阶段进行加载的,在该阶段为类变量分配内存并且设置初始值,下图为初始值
char=
boolean=false
double=0.0
float=0.0
int=0
long=0
short=0
byte=0
然后在初始化阶段为其赋值,而执行顺序则是按照变量和静态代码块声明的顺序。
演示代码如下
public class Test2 {
static{
// System.out.println(a);Error:(5, 28) java: 非法前向引用
System.out.println("这是静态代码块开始----");
b=8;
print();
System.out.println("这是静态代码块结束----");
}
static int a=2;
static int b=4;
public static void print(){
System.out.println("这是静态方法print ");
System.out.println("{");
System.out.println(" a="+a);//0 因为i才刚初始化默认值为0,还没有执行到下面的赋值 a=2
System.out.println(" b="+b);//8 因为j在初始化后被赋值为8
System.out.println("}");
}
public static void main (String args[]) {
new Test2();
System.out.println("a="+Test2.a);
System.out.println("b="+Test2.b);
}
}
执行结果如下:
这是静态代码块开始----
这是静态方法print
{
a=0
b=8
}
这是静态代码块结束----
a=2
b=4
因为静态代码块定义在最前面,所以在代码块里面a还没有被赋值,还是自己的初始值为0,而j从初始化0变成了8
在执行完静态代码块后,a和b进行了再次赋值成了a=2 b=4