今天因为基础知识的问题,踩到一个坑。服务器
我编写了一个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,发现: