序列化的问题

来源:6-3 序列化中子父类构造函数问题

差不多先生1234

2016-05-07 15:37

http://img.mukewang.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回答

  • 慕粉3291149
    2016-05-11 18:27:59
    已采纳

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

    但是老师写的是   Bar2 bar2 = (Bar2)ois.readObject();  这里要注意的是 老师并没有去new一个Bar2对象

    而你却是先new出来的 肯定会调用父类的构造函数

    差不多先生1...

    非常感谢!

    2016-05-17 20:06:48

    共 1 条回复 >

  • 慕运维0341689
    2016-05-07 22:23:06

    子类在进行反序列化操作时,如果父类实现了序列化的接口,则不会递归调用其父类的构造函数,你的代码中父类Bar未实现接口Serializable,所以在实现反序列的时候,当然会调用其构造函数,这个程序的输出结果应该是只输出了Bar的构造函数的内容吧?

    圊涩的苹果 回复差不多先生1...

    bar bar1... bar2... bar 首先就是你是Bar1实现的序列化接口,而Bar1的父类Bar并没有实现序列化接口,所以在readObject()的时候就会调用到Bar类的构造函数,而Bar1类和其子类Bar2就不会调用其构造函数

    2016-06-08 14:57:56

    共 2 条回复 >

文件传输基础——Java IO流

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

133754 学习 · 1030 问题

查看课程

相似问题