Java 静态变量能够被序列化吗?

探讨了静态变量在序列化过程中的行为。通过实验发现,序列化过程中不会保存静态变量,因为序列化关注对象状态而非类的状态。即使修改了静态变量的值,反序列化后的对象仍反映了最新的类状态。

静态变量能够被序列化吗?
我们先定义一个类,定义一个静态变量 staticVar = 5,将它被序列化后,再把 staticVar 设置成10,最后反序列化后得出的对象的staticVar 是5还是10呢?

代码如下:

public class StaticSerializableTest implements Serializable {
    public static int staticVar = 5;
    @Override
    public String toString() {
        return " staticVar = " + staticVar;
    }
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        StaticSerializableTest test = new StaticSerializableTest();
        serializeStaticSerializableTest(test);
        // 修改为10
        StaticSerializableTest.staticVar = 10;
        StaticSerializableTest test2 =   deserializeStaticSerializableTest();
        System.out.println(test2);
    }
    public static void serializeStaticSerializableTest(StaticSerializableTest t) throws IOException {
        ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream("d://static.txt"));
        oo.writeObject(t);
        System.out.println("StaticSerializableTest 序列化 成功");
        oo.close();
    }
    public static StaticSerializableTest deserializeStaticSerializableTest() throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d://static.txt"));
        return  (StaticSerializableTest) ois.readObject();
    }
}

得到的结果时: staticVar = 10;
为什么会等于10呢?

之所以打印10 , 是因为 在序列化的时候,并不保存静态变量,因为序列化保存的是对象状态,而static变量时属于类的状态,因此序列化并不保存静态变量

在这里插入图片描述

Java 中,序列化是指将对象的状态转换为字节流的过程,以便将其保存到文件、数据库或通过网络传输,而反序列化则是将字节流恢复为对象的过程。然而,静态变量序列化与普通实例变量有所不同。 Java序列化机制主要关注对象的实例变量,而静态变量属于类,不属于对象的一部分。当一个对象被序列化时,只有对象的实例变量会被保存到字节流中,静态变量并不会被序列化。这是因为静态变量是类级别的,它们的值是由类的所有实例共享的,并且存储在方法区,而不是对象的堆内存中。 例如,定义一个包含静态变量的类,将该类的一个对象序列化后,修改静态变量的值,再进行反序列化操作,反序列化得到的对象中静态变量的值是修改后的值,而不是序列化时的值。这进一步说明了静态变量不随对象的序列化而保存其状态。 ```java import java.io.*; class SerializableClass implements Serializable { static int staticVar = 5; int instanceVar = 20; } public class StaticSerializationExample { public static void main(String[] args) { try { // 创建对象 SerializableClass obj = new SerializableClass(); // 序列化对象 FileOutputStream fos = new FileOutputStream("test.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(obj); oos.close(); fos.close(); // 修改静态变量的值 SerializableClass.staticVar = 10; // 反序列化对象 FileInputStream fis = new FileInputStream("test.ser"); ObjectInputStream ois = new ObjectInputStream(fis); SerializableClass deserializedObj = (SerializableClass) ois.readObject(); ois.close(); fis.close(); // 输出反序列化静态变量和实例变量的值 System.out.println("Static Variable: " + deserializedObj.staticVar); System.out.println("Instance Variable: " + deserializedObj.instanceVar); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } } ``` 在上述代码中,`staticVar` 是静态变量,`instanceVar` 是实例变量。当对象被序列化后,修改 `staticVar` 的值,反序列化得到的对象中 `staticVar` 的值是修改后的 `10`,而 `instanceVar` 的值是序列化时的 `20`。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半夏_2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值