父类序列化与父类未被序列化,子类在反序列化时父类构造函数的调用问题

`代码如下:``

package com.wgd.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class ObjectSerializable1 {
	public static void main(String[] args) throws Exception{	
ObjectOutputStream oos=new ObjectOutputStream(
		new FileOutputStream(new File("e:\\test\\t.txt")));
ObjectInputStream ois=new ObjectInputStream(
		new FileInputStream("e:\\test\\t.txt"));
/**
 * 父类序列化之后的
 */
//GrandSon gs=new GrandSon();
//oos.writeObject(gs);
//oos.flush();
//oos.close();
//GrandSon gs1=(GrandSon)ois.readObject();//因为GrandSon的父类已经序列化,所以这里不会显示调用父类的构造函数
//System.out.println(gs1);
///**
// * 打印结果为
// * Father
//   Son
//   GrandSon
//   com.wgd.io.GrandSon@119d7047
// */
//ois.close();

/**
 * 父类没被序列化之后的
 */
GrandSon gs=new GrandSon();
oos.writeObject(gs);
oos.flush();
oos.close();
GrandSon gs1=(GrandSon)ois.readObject();//因为GrandSon的父类没被序列化,所以这里会显示调用父类的构造函数
System.out.println(gs1);
/**
 * 打印结果为
Father
Son
GrandSon
Father
com.wgd.io.GrandSon@7229724f
 */
ois.close();
	}
}
/*
 * 如果父类被序列化,那么子类也会被序列化,在反序列时不会去调用父类构造函数
 */
//class Father implements Serializable{
//public Father(){
//	System.out.println("Father");
//}
//}
//class Son extends Father{
//	public Son(){
//		System.out.println("Son");
//	}
//}
//class GrandSon extends Son{
//	public GrandSon(){
//		System.out.println("GrandSon");
//	}
//}
/**
 *父类如果没有实现序列接口,而子类实现序列接口,
 *那么父类对象就不会被序列化,也就不会被保存,
 *而子类却可以被序列化,即保存
 *Java中构造一个对象,首先得先构造父类对象,
 *才会构造子类对象,所以在反序列化子类时,
 *就会调用父类构造方法来作为默认的父类对象
 *而子类因为已经被序列化了(已经调用过子类构造方法的状态),
 *所以就不会再调用子类自己的构造方法
 */
class Father  {
public Father(){
	System.out.println("Father");
}
}
class Son extends Father implements Serializable{
	public Son(){
		System.out.println("Son");
	}
}
class GrandSon extends Son{
	public GrandSon(){
		System.out.println("GrandSon");
	}
}


猜你喜欢

转载自blog.csdn.net/m0_37959155/article/details/83793329
今日推荐