不是说static 变量不能序列化吗?但如下程序:
import java.io.*;
public class DataObject implements Serializable
{
 private  static  int i=0;
 private String word=" ";
public void setWord(String word)
{
this.word=word;
}
public void setI(int i)
{
 this.i=i;
}
public String toString()
{
return "word:"+word+";i="+i;
}
public static void main(String[] args) throws ClassNotFoundException,FileNotFoundException,IOException
{
  DataObject object=new DataObject();
  object.setWord("123");
  object.setI(2);
System.out.println(object);
 ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("lql.out"));
out.writeObject(object);
 ObjectInputStream in=new ObjectInputStream(new FileInputStream("lql.out"));
  DataObject object2=(DataObject)in.readObject();
System.out.println(object2);
}
}
运动后:word=123;i=2;
       word=123;i=2;
这如何解释呢?
请帮忙一下,谢谢!    

解决方案 »

  1.   

    不是说static 变量不能序列化吗你是说不能再赋值吗?static只能补初始化一回,但是是可以改值的,通常是当类第一回new()的时候初始化。
      

  2.   

    你实现了toString()方法嘛。不管写到文件里的是什么格式,只要你取出来打印肯定会调用toString()方法的。
    println(object.toString())
      

  3.   

    稍微修改一下你的代码:import java.io.*; 
    public class DataObject implements Serializable 

    private  static  int i=0; 
    public static Person p=new Person("hello");
    public        Person p2=new Person("world");
    private String word=" "; 
    public void setWord(String word) 

    this.word=word; 

    public void setI(int i) 

    this.i=i; 

    public String toString() 

    return "word:"+word+";i="+i+":"+p.name+":"+p2.name; 

    public static void main(String[] args) throws ClassNotFoundException,FileNotFoundException,IOException 

    DataObject object=new DataObject(); 
    object.setWord("123"); 
    object.setI(2); 
    System.out.println(object); 
    ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("lql.out")); 
    out.writeObject(object); 
    ObjectInputStream in=new ObjectInputStream(new FileInputStream("lql.out")); 
    DataObject object2=(DataObject)in.readObject(); 
    System.out.println(object2); 
    System.out.println(object.p==object2.p);//true
    System.out.println(object.p2==object2.p2);//false


    class Person implements Serializable{   public String name;
       
       public Person(String name){
           this.name=name;
       }
       
       public String toString(){
          return name;
       }
    }并且,就算Person没有implements Serializable,只要是static的也可以读出来
      

  4.   

    static或transient的数据成员是不被序列化的,你之所以能读到static修饰的i字段值,是因为static表示的字段值是在编译时就确定的,并被写入了.class文件中,你可以打开.class文件,一定能找到某个地方存贮了i的值。static修饰的字段被所有这个类的对象共享,这也是为是么你可以使用:类名.字段名,读到static字段值的原因所在。
      

  5.   

    楼主同学,你的static i还在jvm里面,当然还是2了.你要测试的话可以改一下:
    程序一,序列化写到文件
    程序二,反序列化读出来,分别在两个main方法里面做,依此运行两个程序,就能看到你想要的结果了.
      

  6.   

    static 变量怎么可能是编伊时就能确定呢?你想说的是final吧?
      

  7.   

    static 变量不是在第一回new()的时候初始化的,是在类加载的时候.只要有代码引用到这个类,而类还没加载就会去加载这个类,然后初始化静态变量,执行静态代码块.即使没有new()这个类的对象也会这么做的.
      

  8.   

    static变量在编译时就已经分配了内存空间。
      

  9.   

    static 确实没有序列化,你的 static 变量的值是从类里读出来的。你又没变它的值……如果这样:
    object.setI(2);
    System.out.println(object1);
    写入;
    object.setI(3);
    DataObject object2 = 读出;
    System.out.println(object2);就会出现不一样的结果了。
      

  10.   

    static 变量在类首次使用时就会初始化。这里首次使用有6种情况,反序列化就是一种。如果改为transient,就看出来不会被反序列化了。
      

  11.   

    搞定了,6楼说的对,序列化后,在当前JVM中再读,仍然存在,可以再编个文件读,或者sleep(10)就行了,static变量是0子。