Java 静态类变量和序列化/反序列化

Java 静态类变量和序列化/反序列化,java,serialization,static,deserialization,Java,Serialization,Static,Deserialization,《SCJP 6研究指南》中有一个问题,询问有关序列化的以下代码的输出: import java.io.*; public class TestClass { static public void main(String[] args) { SpecialSerial s = new SpecialSerial(); try { ObjectOutputStream os = new ObjectOutputStream(new FileOutputStrea

《SCJP 6研究指南》中有一个问题,询问有关序列化的以下代码的输出:

import java.io.*;

public class TestClass {
  static public void main(String[] args) {
    SpecialSerial s = new SpecialSerial();
    try {
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("myFile"));
        os.writeObject(s);
        os.close();
        System.out.print(++s.z + " ");
        s = null;  // makes no difference whether this is here or not

        ObjectInputStream is = new ObjectInputStream(new FileInputStream("myFile"));
        SpecialSerial s2 = (SpecialSerial)is.readObject();
        is.close();
        System.out.println(s2.y + " " + s2.z);
    } catch (Exception e) {e.printStackTrace();}
  }
}
class SpecialSerial implements Serializable {
    transient int y = 7;
    static int z = 9;
}
其输出为:10 0 10

给出的原因是静态变量z没有序列化,这是我没有预料到的

在println()语句中,将对象写入文件后,静态int变量z的值增加到10

在这种情况下,为什么在反序列化类时不返回其原始值9,或者由于未以正常方式创建该类,因此该类的默认int值为0,而不是在反序列化后保留其非默认增量值10?我本以为它的值是10会丢失,但事实并非如此


有人能解释一下吗?我在黑暗中跌跌撞撞地走在这里,在这一点上我的脚趾头被戳破了。

基本上,实例是序列化的,而不是类。该类声明的任何静态字段都不受该类实例的序列化/反序列化的影响。若要将
z
重置为
9
,则
SpecialSerial
类需要为,这是另一回事。

s2的值。z是
SpecialSerial
类的静态成员
z
的值,这就是它保持为10的原因
z
受类而不是实例的约束

好像是你干的

++SpecialSerial.z
System.out.println(SpecialSerial.z)
而不是

++s.z
System.out.println(s2.z)

啊。。啊,是的,当然-类本身保持加载状态,即使没有实例。哦,是的,所以现在它有了完美的意义。非常感谢!:-)