为了账号安全,请及时绑定邮箱和手机立即绑定

序列化的问题

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流
  • 参与学习       133751    人
  • 解答问题       1030    个

为您介绍IO流的使用,以及对象的序列化和反序列化的内容

进入课程

序列化的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信