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异常。如果父类时不可序列化的,只是带有无参数的构造器,则该父类中定义的成员变量值不会序列化到二进制流中。