以下这段代码会在static块中报错:
public class Test {
static {
a = a + 1;
}
static int a = 10;
}
上面这段代码在编译阶段即会报错,按照这篇文章(楼主先假设该博主的文章是对的)的描述,
首先,
static int a = 10;
会被优化成
static int a;
static {
a = 10;
}
既然如此,那么就是说
a = a + 1;
问题1:
上面这句在执行前,a已经声明过了,那为什么还会出错呢?
问题2:
为什么
a = a + 1;
这句改成
a = 11;
这样的赋值语句就没问题了呢?
注:问题1即为上面文章中底部留言中的问题
建议参考《深入理解Java虚拟机》第七章 7.3.5节 (second edition)。
<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序决定的,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块可以赋值,但是不能访问。