java 创建对象的几种方式 详记

创建对象的方法:new、反射、clone、反序列化

1 new

package xx.study.design.createObj;

public class NewCreateObj {
    public static void main(String[] args) {
        Programmer programmer=new Programmer("程序员",29);
        System.out.println(programmer);
    }

}

2 反射

package xx.study.design.createObj;

import java.lang.reflect.Constructor;

/**
 * Class.newInstance();只能反射无参的构造器,需要构造器可见;
 * Constructor.newInstance();可以反射任何构造器,可以反射私有构造器
 */
public class ReflectCreatObj {

        public static void main(String[] args) throws Exception {
            Class clazz = Programmer.class;
            //利用Class.newInstance()
            Object object1 = clazz.newInstance();
            System.out.println(object1);

            //利用Constructor.newInstance()反射无参构造方法
            Constructor cons1 = clazz.getDeclaredConstructor();
            Object object2 = cons1.newInstance();
            System.out.println(object2);
            //利用Constructor.newInstance()反射私有构造方法
            Constructor cons2 = clazz.getDeclaredConstructor(String.class,Integer.TYPE);
            if(!cons2.isAccessible())
                cons2.setAccessible(true);
            Object object3 = cons2.newInstance("张三",12);
            System.out.println(object3.toString());
        }


}

3 clone

package xx.study.design.createObj;

/**
 * Programmer必须实现Cloneable接口  clone()
 */
public class CloneCreateObj {
    public static void main(String[] args) {
        Programmer programmer=new Programmer("码农",22);
        Programmer programmerTwins= (Programmer) programmer.Clone();
        System.out.println(programmerTwins);
    }
}

4 发序列化

package xx.study.design.createObj;

import java.io.*;

/**
 * 使用 反序列化ObjectInputStream的readObject()方法:类必须实现 Serializable接口
 */
public class SerializableCreateObj {
    public static void main(String[] args) {
        Programmer programmer=new Programmer("cx",22);

        // 序列化
        ObjectOutputStream objectOutputStream = null;
        try {
            //序列化写入文件
            objectOutputStream = new ObjectOutputStream(new FileOutputStream("test.txt"));
            objectOutputStream.writeObject(programmer);
            // 反序列化
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("test.txt"));
            Programmer programmer1 = (Programmer) objectInputStream.readObject();
            System.out.println(programmer1);
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

基类

package xx.study.design.createObj;

import java.io.Serializable;

public class Programmer implements Serializable,Cloneable {
    private String name;
    private int age;

    public Programmer(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Programmer(){}

    @Override
    public String toString() {
        return "Programmer{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public Object Clone(){
        try {
           return super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}

猜你喜欢

转载自blog.csdn.net/h4241778/article/details/107584484