静态变量不会被序列化,因为序列化只处理对象的实例状态,而静态变量属于类状态、存储在方法区、由所有实例共享,objectoutputstream 明确跳过 static 字段。

Java 中 static 静态变量不会被序列化保存,根本原因在于:**序列化只处理对象的实例状态,而静态变量属于类状态,与任何具体对象无关**。
静态变量的本质决定它不在序列化范围内
静态变量随类加载而初始化,存储在方法区(或元空间),生命周期绑定类加载器。它不随对象创建、销毁而变化,所有实例共享同一份数据。ObjectOutputStream 在写入对象时,明确跳过所有 static 字段——既不读取、也不写入、更不报错,这是 JVM 序列化协议的硬性规定,不是疏漏,而是设计使然。
反序列化后看到“原值”其实是错觉
很多人误以为静态变量被保存了,是因为反序列化后打印出的值和序列化前一样。其实那只是因为:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 类在当前 JVM 中未重新加载,静态字段一直保持原有值
- 反序列化过程根本没从流里读这个字段,显示的值完全来自当前类已有的静态状态
- 如果序列化后、反序列化前修改了静态值(比如
MyClass.count = 999),反序列化出来的对象访问该字段,得到的就是 999,而非原始值
static 和 transient 都被跳过,但原因不同
transient 是显式告诉序列化机制:“这个实例字段我不希望保存”;而 static 根本就不属于实例字段范畴——它压根不在序列化的考虑范围内。给静态变量加 transient(如 private static transient int x;)语法合法,但毫无意义。
真要持久化这类数据,得换思路
不能依赖默认序列化,必须主动管理:
- 重写
writeObject和readObject:在其中手动写出/读入静态值(注意字段需 public 或提供 static setter) - 更推荐做法:把本意要随对象一起存取的数据,改为实例字段(去掉
static) - 若需多对象共享,用单例服务、配置中心或外部文件(JSON/YAML)管理,边界更清晰
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










