2011-08-03 54 views
4
public class Employee implements java.io.Serializable 
{ 
public String name; 
public int transient id; 
} 

假設我們正在序列化......瞬態int的反序列化值?

Employee e = new Employee(); 
e.name="REUBEN"; 
e.id=94731; 

現在,如果我反序列化這則

System.out.println("Name: " + e.name); will give the o/p REUBEN 
System.out.println("ID: " + e.id); will give the o/p 0 

很顯然,作爲idtransient它沒有發送到輸出流。

我的問題是,這個零是默認值int
我們不保存狀態,所以它給出的輸出爲0,但它也是一個值。不應該是null

+0

是的。但我不建議依賴它爲'0'(概念上,它是一個未初始化的變量)。 –

+1

你的例子非常糟糕。瞬態修飾符指示一個字段不應該被視爲對象的永久狀態的一部分。 ID通常是員工永久狀態的重要組成部分。 – emory

+0

埃默裏所說的和@機械的,它是零規格,所以不用擔心 – bestsss

回答

9

是的,類的成員變量在它們生成時(當它們在JVM中創建時)獲取其默認值,因此爲0,這是基本類型int類型的默認值。如果這在「驗證」ID是否被髮送時造成問題,只需使用Integer即可得到默認值null(並非它應該是任何混淆的來源,只是說)。

public class Employee implements java.io.Serializable 
{ 
public String name; 
public transient Integer id; 
} 
System.out.println("Name: " + e.name); will give the o/p REUBEN 
System.out.println("ID: " + e.id); will give the o/p null 
+0

@ Sanjay明白了! – Reuben

+0

有點神祕+1 – mKorbel

7

它不能爲空,因爲int是原始類型。相反,它接收該類型的默認值,即0。它始終是任何類型的「自然0」 - 參考類型爲null,數字類型爲0,char爲U + 0000,booleanfalse。有關更多詳細信息,請參閱section 4.12.5 of the Java Language Specification

請注意,如果您只是聲明一個實例/靜態變量並在寫入之前讀取它,那麼這也是您獲得的默認值。

如果要允許id爲空,則需要將其設置爲Integer而不是int

+0

@Downvoter:關心評論? –