亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

序列化的問題

http://img1.sycdn.imooc.com//572d9a9a000104bd04030096.jpg

老師在上面說 如果實現了序列化接口那么其父類的則看不見父類的構造方法被調用。

如果是這樣的話,最后的輸出結果難道不應該是

bar1...

bar2...

嗎?為什么我的結果確實連父類的構造方法也調用了?

package?com.Java;

import?java.io.FileInputStream;
import?java.io.FileOutputStream;
import?java.io.IOException;
import?java.io.ObjectInputStream;
import?java.io.ObjectOutputStream;
import?java.io.Serializable;

public?class?Objectserial2?{
	public?static?void?main(String[]?args)?throws?IOException,?Exception?{
//		ObjectOutputStream?oos=new?ObjectOutputStream(
//				new?FileOutputStream("exer/obj.dat"));
//		Foo2?foo2=new?Foo2();
//		oos.writeObject(foo2);
//		oos.flush();
//		oos.close();
//		
//		//反序列化是否遞歸調用父類的構造函數
//		ObjectInputStream?ois=new?ObjectInputStream(
//				new?FileInputStream("exer/obj.dat"));
//		Foo2?foo21=(Foo2)ois.readObject();
//		System.out.println(foo21);
//		ois.close();
		
		
		ObjectOutputStream?oos=new?ObjectOutputStream(
				new?FileOutputStream("exer/obj.dat"));
		Bar2?bar2=new?Bar2();
		oos.writeObject(bar2);
		oos.flush();
		oos.close();
		
		//反序列化是否遞歸調用父類的構造函數
		
		ObjectInputStream?ois=new?ObjectInputStream(
				new?FileInputStream("exer/obj.dat"));
		Bar2?bar21=(Bar2)ois.readObject();
		System.out.println(bar21);
		ois.close();
		
		/*
		?*?對子類對象進行反序列化操作時,
		?*?如果父類沒有實現序列化接口
		?*?那么其父類的構造函數會被調用
		?*/

	}

}




//一個類實現了序列化接口,那么其子類都可以實現序列化

class?Foo?implements?Serializable{
	public?Foo(){
		System.out.println("fooo");
	}
}
class?Foo1?extends?Foo{
	public?Foo1(){
		System.out.println("fooo11");
	}
}
class?Foo2?extends?Foo1{
	public?Foo2(){
		System.out.println("foo222");
	}
}

class?Bar?{
	public?Bar(){
		System.out.println("bar");
	}
}
class?Bar1?extends?Bar?implements?Serializable{
	public?Bar1(){
		System.out.println("bar1...");
	}
}

class?Bar2?extends?Bar1?{
	public?Bar2(){
		System.out.println("bar2...");
	}
}


正在回答

2 回答

因為 你是 Bar2 bar2 = new Bar2(); ? bar2 = (Bar2)ois.readObject();

但是老師寫的是 ? Bar2 bar2 = (Bar2)ois.readObject(); ?這里要注意的是 老師并沒有去new一個Bar2對象

而你卻是先new出來的 肯定會調用父類的構造函數

0 回復 有任何疑惑可以回復我~
#1

差不多先生1234 提問者

非常感謝!
2016-05-17 回復 有任何疑惑可以回復我~

子類在進行反序列化操作時,如果父類實現了序列化的接口,則不會遞歸調用其父類的構造函數,你的代碼中父類Bar未實現接口Serializable,所以在實現反序列的時候,當然會調用其構造函數,這個程序的輸出結果應該是只輸出了Bar的構造函數的內容吧?

0 回復 有任何疑惑可以回復我~
#1

差不多先生1234 提問者

但是我輸出的內容卻是 bar bar1... bar2... bar 所以我不懂了
2016-05-08 回復 有任何疑惑可以回復我~
#2

圊澀的蘋果 回復 差不多先生1234 提問者

bar bar1... bar2... bar 首先就是你是Bar1實現的序列化接口,而Bar1的父類Bar并沒有實現序列化接口,所以在readObject()的時候就會調用到Bar類的構造函數,而Bar1類和其子類Bar2就不會調用其構造函數
2016-06-08 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
文件傳輸基礎——Java IO流
  • 參與學習       133821    人
  • 解答問題       1060    個

為您介紹IO流的使用,以及對象的序列化和反序列化的內容

進入課程

序列化的問題

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號