作java開發有段時間了,最近沒那麼忙了,抽了點時間看了下java的源碼 。java
在讀源碼的時候看到了一個 transient 修飾的變量 ,字面意思是瞬變的。在之前的開發過程當中也沒用到過這個修飾語,查了一下這個修飾語的做用爲使被 transient 修飾的變量在序列化的時候不會被jvm
保存到文件中,也就是經過序列化後再被反序列化後讀取這個變量不會有值,下面是演示實例:
測試
實體類:
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private transient String password; //被transient修飾的變量
private static String age;
}spa
測試類:blog
public class Test {
public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException {
User user = new User();
user.setAge("22");
user.setName("小明");
user.setPassword("admin");
System.out.println(user.getAge()+"\t"+user.getName()+"\t"+user.getPassword());
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e:/user.txt"));
oos.writeObject(user);
oos.flush();
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e:/user.txt"));
User users = (User) ois.readObject();
System.out.println(users.getAge()+"\t"+users.getName()+"\t"+users.getPassword());
}
}內存
從運行結果能夠看出用 transient 修飾的變量在反序列化後值爲 null開發
被static修飾的變量應該也是不會被序列化的,由於只有堆內存會被序列化.因此靜態變量會天生不會被序列化。get
那這裏被static修飾的變量反序列化後有值又是什麼鬼 這是由於 靜態變量在方法區,原本流裏面就沒有寫入靜態變量,咱們打印靜態變量固然會去方法區查找,咱們當前 jvm 中有因此靜態變量在序列化後任然有值。源碼
接着進行對 static 修飾的變量的驗證:
it
public class Test {
public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException {
User user = new User();
user.setAge("22");
user.setName("小明");
user.setPassword("admin");
System.out.println(user.getAge()+"\t"+user.getName()+"\t"+user.getPassword());
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e:/user.txt"));
user.setAge("33"); //在序列化後在對static修飾的變量進行一次賦值操做
oos.writeObject(user);
oos.flush();
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e:/user.txt"));
User users = (User) ois.readObject();
System.out.println(users.getAge()+"\t"+users.getName()+"\t"+users.getPassword());
}
}
運行結果以下:
能夠看到在序列化前 static 修飾的變量賦值爲22,而反序列化後讀取的這個變量值爲33,由此能夠看出 static 修飾的變量自己是不會被序列化的
咱們讀取的值是當前jvm中的方法區對應此變量的值,因此最後輸出的值爲咱們對static 變量後賦的值
以上代碼只是測試代碼,有邏輯上的問題還望你們見諒。