Java 中创建对象的几种方式?
使用 new 关键字:最常见的方式,这种方式我们还可以调用任意的构造器(无参的和有参的)。
使用Class.newInstance:通过 Class类的newInstance创建对象,必须有public的无参构造器才行。
使用Constructor.newInstance:通过 java.lang.relect.Constructor类中的newInstance方法调用有参数的和私有的构造函数。
使用Clone:通过对象的 clone() 方法创建一个对象的副本。需要对象实现Cloneable接口并重写 clone()方法。
使用反序列化:通过将对象转换为字节流并保存到文件或传输到网络,然后再从字节流中重新创建对象。需要对象实现Serializable
package polo;
import java.io.Serializable;
/**
* 1.使用clone创建对象时,需实现Cloneable接口并重写clone方法
* 访问权限由protected改写为public,并且返回值写为person
*
* 2.使用反序列化创建对象时,需实现Serializable接口
*/
public class User implements Cloneable, Serializable {
private static final long serialVersionUID = -303793456610254190L;
private int id;
private string username;
private String email;
public User() {
}
public User(int id, String username, String email) {
this.id = id;
this.username = username;
this.email = email;
}
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
// toString() method
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", email=" + email + "]";
}
/**
* 访问权限由protected改写为public,并且返回值写为User
* @return
* @throws CloneNotSupportedException
*/
@Override
public User clone() throws CloneNotSupportedException {
return (User)super.clone();
}
}
import org.junit.Test;
import org.Springframework.util.SerializationUtils;
import polo.User;
import java.lang.reflect.Constructor;
/**
* @author 百里
*/
public class BaiLiDemo {
/**
* 使用 new 关键字
*/
@Test
public void createDemo1() {
User user = new User();
User user1 = new User(1, "baili", "baili.com");
System.out.println(user);
System.out.println(user1);
}
/**
* 使用Class.newInstance
*
* @throws Exception
*/
@Test
public void createDemo2() throws Exception {
User user = User.class.newInstance();
System.out.println(user);//User [id=0, username=null, email=null]
}
/**
* 使用Constructor.newInstance
*
* @throws Exception
*/
@Test
public void createDemo3() throws Exception {
// 包括public的和非public的,当然也包括private的
Constructor<?>[] declaredClasses = User.class.getDeclaredConstructors();
// 只返回public的~~~~~~(返回结果是上面的子集)
Constructor<?>[] constructors = User.class.getConstructors();
Constructor<?> noArgsConstructor = declaredClasses[0];
Constructor<?> haveArgsConstructor = declaredClasses[1];
noArgsConstructor.setAccessible(true); // 非public的构造必须设置true才能用于创建实例
Object o = noArgsConstructor.newInstance();
Object o1 = haveArgsConstructor.newInstance(1, "baili", "baili.com");
System.out.println(o);
System.out.println(o1);
}
/**
* 使用Clone
*
* @throws CloneNotSupportedException
*/
@Test
public void createDemo4() throws CloneNotSupportedException {
User user = new User(1, "baili", "baili.com");
User clone = user.clone();
System.out.println(user);
System.out.println(clone);
System.out.println(user == clone);
}
/**
* 使用反序列化
*/
@Test
public void createDemo5() {
User user = new User(1, "baili", "baili.com");
byte[] bytes = SerializationUtils.serialize(user);
// 字节数组:可以来自网络、可以来自文件(本处直接本地模拟)
Object deserialize = SerializationUtils.deserialize(bytes);
System.out.println(user);
System.out.println(deserialize);
System.out.println(user == deserialize);
}
}