• 技术文章 >Java >java教程

    静态变量为什么不能序列化

    anonymityanonymity2020-09-10 15:32:19原创5923
    静态成员属于类级别的,所以不能序列化,这里的不能序列化的意思,是序列化信息中不包含这个静态成员域

    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中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:静态变量
    上一篇:30岁学java怎么样? 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• MySQL中关于静态变量作用的具体分析• PHP中静态变量的使用方法实例详解• C语言中静态变量有什么用
    1/1

    PHP中文网