Java 创建对象一共有四种方式:
1. 运用new关键字来创建对象,这种方式最常见。用的最广。
2. 运用反射手段,调用java.lang.Class 或者 java.lang.reflect.Constructor 类的newInstance()实例方法
3. 调用对象的clone()方法
4. 运用序列化手段,调用java.io.ObjectInputStream 对象的 readObject()方法.
User对象
package com.demo;
import java.io.Serializable;
public class User implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private String sex;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("User [id=");
builder.append(id);
builder.append(", name=");
builder.append(name);
builder.append(", sex=");
builder.append(sex);
builder.append("]");
return builder.toString();
}
}
测试代码
package com.demo;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Main {
public static void main(String[] args) {
//1.运用new关键字来创建对象User
User user = new User();
user.setId(1);
user.setName("我是new出来的");
user.setSex("boy");
System.out.println("运用new关键字来创建的对象:" + user);
//2.运用反射手段,调用java.lang.Class 或者 java.lang.reflect.Constructor 类的newInstance()实例方法
//会有InstantiationException, IllegalAccessException, ClassNotFoundException三个异常
try {
User user1 = (User) Class.forName("com.demo.User").newInstance();
user1.setId(2);
user1.setName("我是反射出来的");
user1.setSex("girl");
System.out.println("运用反射手段来创建的对象:" + user1);
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e1) {
e1.printStackTrace();
}
//3.运用clone()方法产生新对象
//注意1.User对象必须实现 Cloneable接口,如class User implements Cloneable.
//注意2.User必须重写clone()方法,
try {
User temp = new User();
temp.setId(3);
temp.setName("我是clone出来的");
temp.setSex("boy&girl");
User user2 = (User) temp.clone();
System.out.println("运用clone()手段来创建的对象:" + user2);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
//4.运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
//注意:被序列化的对象必须implements Serializable
User temp = new User();
temp.setId(4);
temp.setName("我是反序列化出来的");
temp.setSex("boy&girl");
User user3 = cloneTo(temp);
System.out.println("运用反序列化手段来创建的对象:" + user3);
}
@SuppressWarnings("unchecked")
public static <T> T cloneTo(T src) throws RuntimeException {
ByteArrayOutputStream memoryBuffer = new ByteArrayOutputStream();
ObjectOutputStream out = null;
ObjectInputStream in = null;
T dist = null;
try {
out = new ObjectOutputStream(memoryBuffer);
out.writeObject(src);
out.flush();
in = new ObjectInputStream(new ByteArrayInputStream(
memoryBuffer.toByteArray()));
dist = (T) in.readObject();
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
if (out != null)
try {
out.close();
out = null;
} catch (IOException e) {
throw new RuntimeException(e);
}
if (in != null)
try {
in.close();
in = null;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return dist;
}
}
运行效果:
运用new关键字来创建的对象:User [id=1, name=我是new出来的, sex=boy]
运用反射手段来创建的对象:User [id=2, name=我是反射出来的, sex=girl]
运用clone()手段来创建的对象:User [id=3, name=我是clone出来的, sex=boy&girl]
运用反序列化手段来创建的对象:User [id=4, name=我是反序列化出来的, sex=boy&girl]