Java创建对象的五种方式

Java创建对象大概有五种方式

import java.io.*;
import java.lang.reflect.*;
class Parent //implements Serializable
{
    public Parent()
    {
        System.out.println("parent");
    }
}
class Child extends Parent implements Serializable,Cloneable
{
    public Child()
    {
        System.out.println("child");
    }
    public Object clone()
    {
        Object obj=null;
        try
        {
            obj=super.clone();
        }
        catch (CloneNotSupportedException ex)
        {
            ex.printStackTrace();
        }
        return obj;
    }
}
public class Test 
{
    public static void main(String[] args) 
    {
        System.out.println("---使用new关键字创建对象---");
        Child child=new Child();
        //*************************
        System.out.println("---使用反序列化创建对象---");
        File file =new File("object.txt");
        try
        {
            FileOutputStream fos=new FileOutputStream(file);
            ObjectOutputStream oos=new ObjectOutputStream(fos);
            oos.writeObject(child);
            oos.flush();
            oos.close();
            fos.close();
            //反序列化创建对象
            FileInputStream fis=new FileInputStream(file);
            ObjectInputStream ois=new ObjectInputStream(fis);
            Child firChild=(Child)ois.readObject();
            ois.close();
            fis.close();
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
        //*************************
        System.out.println("---使用clone方法创建对象---");
        Child secChild=(Child)child.clone();
        //*************************
        System.out.println("---使用Class类的newInstance方法创建对象---");
        try
        {
            Child thiChild=(Child)Class.forName("Child").newInstance();
            System.out.println("------");
            Child fouChild=Child.class.newInstance();
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
        //*************************
        System.out.println("---使用Construcotr类的newInstance方法创建对象---");
        try
        {
            Constructor<Child> constructor=Child.class.getConstructor();
            Child fifChild=constructor.newInstance();
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

输出结果

可以看出,new关键字,Class类的newIntsance方法和Constructor类的newInstance方法创建对象时会调用Child类的构造器。
然而奇怪的是反序列化时会调用父类Parent的构造器。这是因为当一个可序列化类有多个父类时(包括直接父类和间接父类),这些父类要么有无参数的构造器,要么也是可序列化的——否则反序列化时将抛出InvalidClassException异常。如果父类时不可序列化的,只是带有无参数的构造器,则该父类中定义的成员变量值不会序列化到二进制流中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,954评论 18 399
  • 转自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帅199207阅读 12,740评论 3 93
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 11,937评论 0 62
  • 第一章:Java程序设计概述 Java和C++最大的不同在于Java采用的指针模型可以消除重写内存和损坏数据的可能...
    loneyzhou阅读 5,039评论 1 7
  • 到底是蝴蝶飞不过沧海,还是海的对岸没有了期待。到底是内心牵挂着什么,还是辗转反侧难以入睡?睡吧,我的宝贝,何必跟自...
    1242fa2bccf3阅读 1,904评论 0 0