Java对象实例化有以下6种方式:

1、采用new关键字  SimpleBean simpleBean = new SimpleBean();

2、采用Class.forName("SimpleBean").newInstance();

3、采用Constructor.newInstance()

可用于只有私有构造方法的类实例化,利用反射,获取构造方法, 修改构造方法的访问权限为accessable

4、实现java.lang.Cloneable接口,调用clone方法

5、实现java.io.Serializable接口,反序列化

6、实现java.io.Externalizable接口

必须显示的写构造方法

实例代码如下:

 

import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class WayOfInitInstance {
    public SimpleObject m1() {
        SimpleObject simpleObject = new SimpleObject();
        return simpleObject;
    }

    public SimpleObject m2() {
        try {
            SimpleObject simpleObject = (SimpleObject) Class.forName("SimpleObject").newInstance();
            return simpleObject;
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;

    }

    public SimpleObject m3() {
        Constructor<?>[] constructors = SimpleObject.class.getDeclaredConstructors();
        try {
            SimpleObject instance = (SimpleObject) constructors[0].newInstance();
            return instance;
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        return null;
    }

    public SimpleObject m4() {
        SimpleObject simpleObject = m3();

        try {
            return simpleObject.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        return null;
    }

    public SimpleObject m5() {
        SimpleObject simpleObject = m3();

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        try {
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
            objectOutputStream.writeObject(simpleObject);

            objectOutputStream.flush();
            objectOutputStream.close();

            byte[] bytes = byteArrayOutputStream.toByteArray();

            ByteArrayInputStream byteInputStream = new ByteArrayInputStream(bytes);
            ObjectInputStream objectInputStream = new ObjectInputStream(byteInputStream);

            SimpleObject object = (SimpleObject) objectInputStream.readObject();

            return object;
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return null;
    }

    public SerialiableObject m6() {
        try {
            SerialiableObject serialiableObject = new SerialiableObject();

            System.out.println(serialiableObject);

            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

            ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);

            objectOutputStream.writeObject(serialiableObject);

            objectOutputStream.flush();

            objectOutputStream.close();

            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());

            ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);

            SerialiableObject object = (SerialiableObject) objectInputStream.readObject();

            return object;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }


    public static void main(String[] args) {
        WayOfInitInstance wayOfInitInstance = new WayOfInitInstance();
        SimpleObject m1 = wayOfInitInstance.m1();
        SimpleObject m2 = wayOfInitInstance.m2();
        SimpleObject m3 = wayOfInitInstance.m3();
        SimpleObject m4 = wayOfInitInstance.m4();
        SimpleObject m5 = wayOfInitInstance.m5();
        System.out.println(m1);
        System.out.println(m2);
        System.out.println(m3);
        System.out.println(m4);
        System.out.println(m5);

        System.out.println(m1.equals(m2));
        System.out.println(m2.equals(m3));
        System.out.println(m3.equals(m4));
        System.out.println(m4.equals(m5));

        System.out.println(m1 == m2);
        System.out.println(m2 == m3);
        System.out.println(m3 == m4);
        System.out.println(m4 == m5);

        System.out.println(wayOfInitInstance.m6());
    }
}


class SimpleObject implements Cloneable, Serializable {
    private String name;
    private Integer 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
    protected SimpleObject clone() throws CloneNotSupportedException {
        return (SimpleObject) super.clone();
    }
}

class SerialiableObject implements Externalizable {
    private String name;

    public SerialiableObject() {

    }

    public String getName() {
        return name;
    }

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

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(name);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        this.name = (String) in.readObject();
    }
}