這篇文章將為大家詳細(xì)講解有關(guān)靜態(tài)變量不能序列化的原因,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、富民ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的富民網(wǎng)站制作公司
靜態(tài)成員屬于類級(jí)別的,所以不能序列化,這里的不能序列化的意思,是序列化信息中不包含這個(gè)靜態(tài)成員域
這里有一個(gè)示例很好的證明了靜態(tài)變量為什么不能序列化:
類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("調(diào)用Student的帶參構(gòu)造方法 "); this.name = name; this.password = password; count++; } public String toString(){ return "人數(shù):" + 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(); } } }
運(yùn)行結(jié)果:
調(diào)用Student的帶參構(gòu)造方法
調(diào)用Student的帶參構(gòu)造方法
人數(shù):2姓名:張三密碼:null
人數(shù):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(); } } }
運(yùn)行結(jié)果:
人數(shù):0姓名:張三密碼:null
人數(shù):0姓名:王五密碼:null
總結(jié):
類ObjectSerTest1 的運(yùn)行結(jié)果顯示count=2,似乎被序列化了,但是類Test1的運(yùn)行結(jié)果顯示count=0并未被序列化。
”序列化保存的是對(duì)象的狀態(tài),靜態(tài)變量數(shù)以類的狀態(tài),因此序列化并不保存靜態(tài)變量。
這里的不能序列化的意思,是序列化信息中不包含這個(gè)靜態(tài)成員域
ObjectSerTest1 測(cè)試成功,是因?yàn)槎荚谕粋€(gè)機(jī)器(而且是同一個(gè)進(jìn)程),因?yàn)檫@個(gè)jvm已經(jīng)把count加載進(jìn)來(lái)了,所以你獲取的是加載好的count,如果你是傳到另一臺(tái)機(jī)器或者你關(guān)掉程序重寫寫個(gè)程序讀入test.obj,此時(shí)因?yàn)閯e的機(jī)器或新的進(jìn)程是重新加載count的,所以count信息就是初始時(shí)的信息?!?----來(lái)自參考網(wǎng)頁(yè)
重寫類Test1讀取test.obj顯示的結(jié)果是count的初始時(shí)的信息,也驗(yàn)證了上面一段話。
最后,Java對(duì)象的static,transient 修飾的屬性不能被序列化。
關(guān)于靜態(tài)變量不能序列化的原因就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
新聞名稱:靜態(tài)變量不能序列化的原因
本文網(wǎng)址:http://muchs.cn/article26/jpedjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站設(shè)計(jì)公司、云服務(wù)器、App開發(fā)、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)