java中static、transient修饰的属性不能被序列化

相关网页:Java序列化的高级认识http://www.360doc.com/content/13/0728/18/13247663_303173972.shtml

以下程序来自”http://bbs.csdn.net/topics/390155251“(已验证)

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

时间: 2024-11-07 14:42:48

java中static、transient修饰的属性不能被序列化的相关文章

Java中 static/transient,final/volatile 说明

你可以任意使用如下的修改限定关键字来定义一个字段:final或者volatile和/或者static和/或者transient. 如果你将一个字段定义为final,编译器将确保字段当成一个常量——只读变量来初始化和处理.因为编译器知道常量是不变的,所以在程序的字节码中对其进行了内部优化. class Employee { final int ACCOUNTANT = 1; final int PAYROLL_CLERK = 2; final int MANAGER = 3; int jobID

java中static的使用

我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,有时候,我们希望该类的所有成员共享一个成员.这时可以用static来修饰. Java中static作为修饰符,可以用来修饰变量.方法.代码块. 1.静态方法 被static修饰的变量成为静态变量,又可以成为静态成员或类成员.它属于整个类所有,而不是某个对象所有,被类的所有对象共享.类变量在类加载的时候初始化分配空间,而且只被初始化一次,直到该类被卸载时才将资源回收. 静态成员可以使用类名直接访问,也可以使用对象进行访问.在程序中任何

Java中的transient关键字

今天刷面试题,碰到了一道这样的题: 上图中的transient关键字我第一次遇见,于是看了些博客,了解了它的用法. transient关键字的作用: transient用来修饰类的成员属性,而被transient修饰的属性在对象被序列化时,不会进行序列化: 所以transient关键字的作用就是让类的成员属性不被序列化.常用在没有必要进行序列化的属性之上,比如说一个矩形类有三个属性,分别为长.宽和面积,而面积可以通过长宽推导出来,所以如果需要序列化矩形类的对象,那这个面积属性可以不用序列化,其好

Java中的transient关键字,在移动开发中的使用

transient关键词修饰的属性是临时的,不会被序列化.那么开发移动接口的同志们应该特别注意使用,这样可以提高不少效率.当然其他方面也要适当使用,通过这个特性,可以提高序列化的效率! 百度解释如下,看似别扭难理解,明天去公司写段代码上海,让大家参考下! Java中的transient关键字,在移动开发中的使用,码迷,mamicode.com

详解Java中的访问控制修饰符(public, protected, default, private)

Java中的访问控制修饰符已经困惑笔者多时,其中较复杂的情况一直不能理解透彻.今天下定决心,系统.全面地研究Java中的访问控制修饰符的所有方面,并整理成这篇文章,希望有同样疑惑的读者读完后能有所收获.如果文章中出现错误,欢迎评论指出,共同交流~ 说在前面:这篇文章只研究Java中访问控制修饰符声明类的变量/方法的情况. 先抛出结论: * 成员变量/方法的访问权限 *                                        private        default  

Java 中关键字transient引出序列化与反序列化

一:transient(临时的)关键字 1.transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被transient关键字修饰的. 2.被transient关键字修饰的变量不能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化. 3.一旦变量被transient修饰,变量将不再是持久化的一部分,该变量内容在序列化后无法获得访问.也可以认为在将持久化的对象反序列化后,被transient修饰的变量将按照普通类成员变量一样被初始化. 二:java对象序列

关于Java中的transient关键字

Java中的transient关键字是在序列化时候用的,如果用transient修饰变量,那么该变量不会被序列化. 下面的例子中创建了一个Student类,有三个成员变量:id,name,age.age字段被transient修饰,当该类被序列化的时候,age字段将不被序列化. 1 import java.io.Serializable; 2 public class Student implements Serializable{ 3 int id; 4 String name; 5 tran

java中static、final、static final的区别

final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final修饰的属性跟具体对象有关,在运行期初始化的final属性,不同对象可以有不同的值. final修饰的属性表明是一个常数(创建后不能被修改). final修饰的方法表示该方法在子类中不能被重写,final修饰的类表示该类不能被继承. 对于基本类型数据,final会将值变为一个常数(创建后不能被修改):但是对于对象句柄(亦可称作引用或者指针),fin

java中static作用详解

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们.因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象. 用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类