Java不通过构造函数也能创建对象吗?

Java创建对象的几种方式(重要):

1、用new语句创建对象,这是最常见的创建对象的方法。

2、运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。

3、调用对象的clone()方法。

4、运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。

(1)和(2)都会明确的显式的调用构造函数;

(3)是在内存上对已有对象的影印,所以不会调用构造函数;

(4)是从文件中还原类的对象,也不会调用构造函数。

代码展示

public class Person implements Cloneable, Serializable {
    String name;
    Integer age;


    public Person() {

    }
    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public Person clone() throws CloneNotSupportedException {
        return (Person) super.clone();
    }
}
  private static final String path =  "test.txt";

    @Test
    public void testNewObject(){
        Person u = new Person("u", 1);
        System.out.println(u.toString());
    }

    @Test
    public void testReflectCreateObject(){
        try {
            Class person = Class.forName("com.test.Person");
            try {
                Constructor constructor =  person.getConstructor(String.class,Integer.class);
                Object p = constructor.newInstance("r", 1);

                System.out.println(p);
            } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testClone(){
        Person person = new Person("b",1);
        try {
            Person p1 = person.clone();
            System.out.println(p1.toString());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testSerializePerson(){
        try {
            SerializePerson();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            DeserializePerson();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    private static void SerializePerson() throws FileNotFoundException,
            IOException {
        Person person = new Person("w",1);
        // ObjectOutputStream 对象输出流,将Person对象存储到E盘的Person.txt文件中,完成对Person对象的序列化操作
        ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(
                path));
        oo.writeObject(person);
        System.out.println("Person对象序列化成功!");
        oo.close();
    }


    private static Person DeserializePerson() throws Exception, IOException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
                path));
        Person person = (Person) ois.readObject();
        System.out.println(person.toString());
        return person;
    }


版权声明:本文为huzi99原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。