php入门到就业线上直播课:进入学习
这里有一个示例很好的证明了静态变量为什么不能序列化:
类Student1
package test; import java.io.Serializable; public class Student1 implements Serializable{ private static final long serialVersionUID = 1L; private String name; private transient String password; private static int count = 0; public Student1(String name,String password){ System.out.println("调用Student的带参构造方法 "); this.name = name; this.password = password; count++; } public String toString(){ return "人数:" + count + "姓名:" + name + "密码:" + password; } }
类ObjectSerTest1
package test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class ObjectSerTest1 { public static void main(String args[]){ try{ FileOutputStream fos = new FileOutputStream("test.obj"); ObjectOutputStream oos = new ObjectOutputStream(fos); Student1 s1 = new Student1("张三","123456"); Student1 s2 = new Student1("王五","56"); oos.writeObject(s1); oos.writeObject(s2); oos.close(); FileInputStream fis = new FileInputStream("test.obj"); ObjectInputStream ois = new ObjectInputStream(fis); Student1 s3 = (Student1) ois.readObject(); Student1 s4 = (Student1) ois.readObject(); System.out.println(s3); System.out.println(s4); ois.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e1) { e1.printStackTrace(); } } }
运行结果:
调用Student的带参构造方法
调用Student的带参构造方法
人数:2姓名:张三密码:null
人数:2姓名:王五密码:null
类Test1
package test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class Test1{ public static void main(String args[]){ try { FileInputStream fis = new FileInputStream("test.obj"); ObjectInputStream ois = new ObjectInputStream(fis); Student1 s3 = (Student1) ois.readObject(); Student1 s4 = (Student1) ois.readObject(); System.out.println(s3); System.out.println(s4); ois.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e1) { e1.printStackTrace(); } } }
运行结果:
人数:0姓名:张三密码:null
人数:0姓名:王五密码:null
总结:
类ObjectSerTest1 的运行结果显示count=2,似乎被序列化了,但是类Test1的运行结果显示count=0并未被序列化。
”序列化保存的是对象的状态,静态变量数以类的状态,因此序列化并不保存静态变量。
这里的不能序列化的意思,是序列化信息中不包含这个静态成员域
ObjectSerTest1 测试成功,是因为都在同一个机器(而且是同一个进程),因为这个jvm已经把count加载进来了,所以你获取的是加载好的count,如果你是传到另一台机器或者你关掉程序重写写个程序读入test.obj,此时因为别的机器或新的进程是重新加载count的,所以count信息就是初始时的信息。“-----来自参考网页
重写类Test1读取test.obj显示的结果是count的初始时的信息,也验证了上面一段话。
最后,Java对象的static,transient 修饰的属性不能被序列化。
以上就是静态变量为什么不能序列化的详细内容,更多请关注php中文网其它相关文章!
前端(VUE)零基础到就业课程:点击学习
自己动手写 PHP MVC 框架:点击学习
![](http://m.sbmmt.com/img/upload/article/000/000/020/633501a29d313483.png)