jvm - Java static 变量声明、初始化顺序问题
本文介绍了jvm - Java static 变量声明、初始化顺序问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
以下这段代码会在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>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序决定的,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块可以赋值,但是不能访问。
这篇关于jvm - Java static 变量声明、初始化顺序问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文