今天碰到一個題目,經過類名引用final靜態字符串變量時,是否會觸發類的初始化。spa
原來在書上看到類的初始化時機有這麼一句話「讀取或設置一個類的靜態變量(被final修飾,已在編譯期把結果放入常量池的靜態字段除外)」對象
兩部分都很重要!blog
今天發現給final變量賦值「sss」和new String(「sss」)是不一樣的效果。字符串
圖一編譯
圖二變量
仔細讀那句話,圖一在編譯期就把「sss」放入了常量池(類加載的準備階段完成賦值),而圖二new String(「sss」)至關於一個對象,是在堆中的,因此是等到類初始化以後,才進行賦值。因此才產生了這樣的差別。引用