Java為什麼對常量的修改沒有生效?
寫這篇文章的起因是前幾天同事改了一個常量類中的提示,發布到測試環境後沒有生效,正好看 《Java 解惑(謎題 93: 類的戰爭)》 提到了這個問題,所以寫篇文章記錄一下。
以下均使用命令行進行演示,至於為什麼沒有使用 IDE 後面會提到。
先看一個簡單的 Contants 類:
再看下 Solution 類:
編譯,運行 Solution 的主函數,毫無疑問結果如圖:
現在我們把 Constants 類修改為:
重新編譯 Constants 類,再運行 Solution 的主函數,輸出結果如圖:
為什麼修改沒有生效?是 Constants 類的問題,還是 Solution 類的問題?
我們先反編譯 Constants 類看看:
由上圖可見,對 Constants 類的修改是生效的。
再看反編譯的 Solution 類:
看到這裡,原因也就明確了,常量變數會被編譯進那些引用它們的類中。這和筆者同事前幾日遇到的情況一模一樣,同事在本地開發時修改了常量類中的常量欄位的值,本地是生效的,原因是因為本地開發使用了 IDE,而 IDE 將引用到常量類的類也重新編譯了,所以能看到最新的值,而在發布到測試環境的過程中,打包機使用增量編譯,只是重新編譯了源代碼被更改過的類,未將引用常量的類重新編譯,所以當時看見的是更改前的值,同事將常量類的 class 文件反編譯後看見的也是修改後的值,但是卻忘了看引用該常量類的類,所以當時沒有發現這個問題。
學習Java的同學注意了!!!
學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流群495273252,我們一起學Java!
TAG:Java團長 |
※蘋果新規則開始生效,不知這樣的iphone你還會喜歡嗎?
※Google Play反挖礦政策或並未生效
※紅色預警生效,他們為了喬丹可以群毆,為了Supreme可以瘋狂,真的值嗎?
※不歡而散,Raf Simons離任Calvin Klein,立即生效
※怎麼檢查/GA/Google tag manager是否已經生效
※GDPR生效,數據可攜權和被遺忘權,你怎麼看?
※中國造被亞馬遜召回,存在安全隱患?亞馬遜新規即將生效,這些品類的賣家要修改listing?
※詳解Github的.gitignore忽略文件+.gitignore不生效解決+生產配置
※谷歌 Dropout 專利生效,AI 圈內人表示坐不住了!
※eBay更改Premium Service標籤獲得標準,7月1日生效
※谷歌 Dropout 專利生效,AI 圈內人表示坐不住了
※美對Apple Watch、AirPods等征的關稅開始生效
※GDPR等監管法規陸續生效,Facebook與谷歌受到嚴重影響
※萬萬沒想到,谷歌給Dropout申請了專利,而且剛剛生效
※憑什麼!憑什麼他們的原生效果能做這麼好?——IT行業原生案例大禮包
※Nature子刊兩聯發:重磅揭秘抗癌基因生效的關鍵因素!
※Intel推出10nm 3D新CPU架構,讓失效的摩爾定律再次生效!
※「吸引力法則」為何沒有生效?
※庫克終於低頭,蘋果新規3月正式生效,老iPhone或「復活」?
※常吃大蒜養生效果好,但醫生卻說:3類人要忌口,多吃對身體不利