序列化的問題
老師在上面說 如果實現了序列化接口那么其父類的則看不見父類的構造方法被調用。
如果是這樣的話,最后的輸出結果難道不應該是
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..."); } }
2016-05-11
因為 你是 Bar2 bar2 = new Bar2(); ? bar2 = (Bar2)ois.readObject();
但是老師寫的是 ? Bar2 bar2 = (Bar2)ois.readObject(); ?這里要注意的是 老師并沒有去new一個Bar2對象
而你卻是先new出來的 肯定會調用父類的構造函數
2016-05-07
子類在進行反序列化操作時,如果父類實現了序列化的接口,則不會遞歸調用其父類的構造函數,你的代碼中父類Bar未實現接口Serializable,所以在實現反序列的時候,當然會調用其構造函數,這個程序的輸出結果應該是只輸出了Bar的構造函數的內容吧?