`
cakin24
  • 浏览: 1412272 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

序列化中子父类构造函数问题

    博客分类:
  • java
阅读更多
一 介绍
1、如果父类实现了序列化接口,子类就不需要实现序列化接口。
2、创建对象的时候,递归调用了父类的构造函数。
3、对子类对象进行反序列化操作时,如果其父类没有实现序列化接口,那么其父类的构造函数会被调用,否则不会被调用。
 
二 实例
package com.imooc.io;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
 
public class ObjectSeriaDemo2 {
    public static void main(String[] args) throws Exception{
         ObjectOutputStream oos = new ObjectOutputStream(
                 new FileOutputStream("demo/obj1.dat"));
         Foo2 foo1 = new Foo2();   //创建对象的时候,递归调用了父类的构造函数
         oos.writeObject(foo1);
         oos.flush();
         oos.close();
         
         //反序列化是否递归调用父类的构造函数,不能证明
         ObjectInputStream ois = new ObjectInputStream(
                 new FileInputStream("demo/obj1.dat"));
         Foo2 foo2 = (Foo2)ois.readObject();
         System.out.println(foo2);
         ois.close();
         
         
         ObjectOutputStream oos1 = new ObjectOutputStream(
                 new FileOutputStream("demo/obj1.dat"));
         Bar2 bar1 = new Bar2();
         oos1.writeObject(bar1);
         oos1.flush();
         oos1.close();
         
         ObjectInputStream ois1 = new ObjectInputStream(
                 new FileInputStream("demo/obj1.dat"));
         Bar2 bar2 = (Bar2)ois1.readObject();
         System.out.println(bar2);
         ois1.close();
         
         
         /*
          * 对子类对象进行反序列化操作时,
          * 如果其父类没有实现序列化接口
          * 那么其父类的构造函数会被调用
          */
    }
}
/*
 *   一个类实现了序列化接口,那么其子类都可以进行序列化
 */
class Foo implements Serializable{ 
    public Foo(){
         System.out.println("foo...");
    }
}
class Foo1 extends Foo{
    public Foo1(){
         System.out.println("foo1...");
    }
}
class Foo2 extends Foo1{
    public Foo2(){
         System.out.println("foo2...");
    }
}
class Bar{
    public Bar(){
         System.out.println("bar");
    }
}
class Bar1 extends Bar{
    public Bar1(){
         System.out.println("bar1..");
    }
}
class Bar2 extends Bar1 implements Serializable{
    public Bar2(){
         System.out.println("bar2...");
    }
}
 
三 运行结果
foo...
foo1...
foo2...
com.imooc.io.Foo2@913fe2
bar
bar1..
bar2...
bar
bar1..

 

com.imooc.io.Bar2@eb7859
1
0
分享到:
评论

相关推荐

    Java序列化中子类、父类构造函数问题实例分析

    Java序列化中子类、父类构造函数问题实例分析 本文主要介绍了Java序列化中子类、父类构造函数问题,结合实例形式分析了java父类与子类构造函数中序列化接口调用相关操作技巧与使用注意事项。 一、序列化接口的实现...

    SimpleJava.pdf

    Java中子类与超类的构造函数 - **构造函数调用**:子类构造函数必须显式调用超类构造函数。 - **super关键字**:使用super关键字调用超类构造函数。 - **构造顺序**:先执行超类构造函数,再执行子类构造函数。 #...

    2021-2022计算机二级等级考试试题及答案No.19653.docx

    14. 类的构造函数A(int aa, int bb)执行后,x.a和x.b的值分别为4和20(C)。 15. 宏设计器(B)是用于创建宏的工具。 16. 根据后序遍历序列dabec和中序遍历序列debac,可以推断出前序遍历序列是cedba(D)。 17. ...

    软件工程-理论与实践(许家珆)习题答案

    需求模型的表现形式有自然语言、半形式化(如图、表、结构化英语等)和形式化表示等三种。需求概念模型的要求包括实现的独立性:不模拟数据的表示和内部组织等;需求模拟技术又分为企业模拟、功能需求模拟和非功能需求...

    php开发中最常用的英语单词.docx

    10. **Algorithm**:算法,解决问题或执行任务的步骤序列。 11. **Alias**:别名,为变量、函数或类创建的另一个名称。 12. **Align**:排列、对齐,确保元素在布局中对齐的方式。 13. **Allocate**:分配,分配...

Global site tag (gtag.js) - Google Analytics