首頁  >  文章  >  Java  >  靜態變數為什麼不能序列化

靜態變數為什麼不能序列化

anonymity
anonymity原創
2019-05-07 09:41:268749瀏覽

靜態成員屬於類別層級的,所以不能序列化,這裡的不能序列化的意思,是序列化資訊中不包含這個靜態成員域

靜態變數為什麼不能序列化

#這裡有一個範例很好的證明了靜態變數為什麼不能序列化:

#類別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