中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

靜態變量不能序列化的原因

發布時間:2020-10-13 17:44:23 來源:億速云 閱讀:467 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關靜態變量不能序列化的原因,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

靜態成員屬于類級別的,所以不能序列化,這里的不能序列化的意思,是序列化信息中不包含這個靜態成員域

靜態變量不能序列化的原因

這里有一個示例很好的證明了靜態變量為什么不能序列化:

類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 修飾的屬性不能被序列化。

關于靜態變量不能序列化的原因就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

横山县| 富顺县| 盐城市| 台中市| 甘肃省| 师宗县| 南昌县| 会宁县| 青州市| 赫章县| 武乡县| 独山县| 威信县| 赤城县| 镇赉县| 许昌县| 兰州市| 南康市| 临沂市| 滨海县| 论坛| 凤山市| 手机| 皮山县| 合水县| 孟州市| 肇州县| 图们市| 永吉县| 青海省| 永川市| 喀喇沁旗| 肥乡县| 平南县| 凤山市| 上思县| 土默特左旗| 郁南县| 应用必备| 治县。| 康乐县|