java变量不可读为什么,静态变量为什么不能序列化

静态成员属于类级别的,所以不能序列化,这里的不能序列化的意思,是序列化信息中不包含这个静态成员域

c8bdac291af612043e72072b5c454a2f.png

这里有一个示例很好的证明了静态变量为什么不能序列化:

类Student1package 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;

}

}

类ObjectSerTest1package 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

类Test1package 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 修饰的属性不能被序列化。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值