今天因爲基礎知識的問題,踩到一個坑。服務器
我編寫了一個mqttclient.jar,提供給第三方系統接入使用,mqttclient.jar內部使用了public static final的常量,當第三方須要的時候,傳入。內存
第三方也是將他們編寫的程序打成了jar包來執行,會引用我提供的mqttclient.jar開發
由於我後期程序變動,修改了jar包中的一個常量,但沒有告知第三方開發人員,以爲不會有影響,便直接把最新的jar給出,部署
此時第三方直接將新的mqttclient.jar覆蓋原來的,並無從新打包他們的程序,get
因此第三方的程序中的常量仍是保持了原來的常量值,與此時jar包內部的不一致,致使問題的發生。qt
static主要做用是在類剛加載時就初始化該量的值並給他分配一塊共用的內存塊存儲他的值.
本身寫了一個demo復現了以上過程:io
1. 模擬第三方,編寫程序,調用mqttclient.jar中的常量:編譯
public static void main(String[] args) throws Exception { System.out.println("我是mqttclient.jar中的常量:" + MqttClient.REQTYPE_INSIGHT); }
2. 將該簡單的main方法工程打包成一個test.jar,部署在服務器執行test
3. 刪除引用的mqttclient.jar,執行test.jar,執行後,常量值仍然是1802基礎
4. 反編譯test.jar發現:
5. 去掉final關鍵字後,編譯test.jar,發現: