静态代码块可以将在其之后出现的静态常量进行复制
比如底下这个例子,开始确实挺难理解的,觉得是肯定是static int m=100; 先执行,因为上面的静态代码块里m未定义类型,所以我特意将底下的定义类型给注释掉看结果
public class Test {
public static void main(String[] args) {
A a = new A();
System.out.println(a.m);
}
}
class A{
static{
System.out.println("A类静态代码块" );
m=200;
}
static int m=100;
public A(){
System.out.println("B类代码块");
}
}
可以看到,结果如下图。我分析了一下,以下是我的见解
static int m=100
这行代码其实是执行了两个步骤,
- 1.定义了一个int类型的常量
- 2.对其进行赋值
也就是说在为m进行初始化的时候m的初值应该是0,此时在常量池中为其开辟了空间。然后才是进行赋值操作。在赋值时,静态代码块和静态常量都是静态的,应当由上往下执行,所以m先被赋值为200,然后才执行到了m=100,这也就不难理解为啥最后输出的m是100。