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();
}
}