以下這段代碼會在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即為上面文章中底部留言中的問題
1 回答

POPMUISE
TA貢獻1765條經驗 獲得超5個贊
建議參考《深入理解Java虛擬機》第七章 7.3.5節 (second edition)。
<clinit>()方法是由編譯器自動收集類中的所有類變量的賦值動作和靜態語句塊中的語句合并產生的,編譯器收集的順序是由語句在源文件中出現的順序決定的,靜態語句塊中只能訪問到定義在靜態語句塊之前的變量,定義在它之后的變量,在前面的靜態語句塊可以賦值,但是不能訪問。
添加回答
舉報
0/150
提交
取消