java创建对象的方式和差别

本文已例子和原理解释4种java创建对象的方式和原理。

在此之前,我们以User类为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class User implements Serializable {
private String name;

public User() {
System.out.println("user default constructor...");
}

public User(String name) {
this.name = name;
System.out.println("constructor with name...");
}

public String getName() {
return name;
}

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

1.new

这种方式没什么好说的,主要从JVM的角度来看类的加载机制。

1
2
// 1. new
User user1 = new User();

2.反射

下面是2种方式,区别在于第一种(Class.forName().newInstance())只能调用无参构造方法。

1
2
3
4
5
6
7
8
		// 2. reflect
Class<?> cls = Class.forName("com.jimo.ioc.User");
User user2 = (User) cls.newInstance();
/// User user3 = User.class.newInstance();

Constructor<?> c1 = cls.getDeclaredConstructor(String.class);
c1.setAccessible(true);
User user4 = (User) c1.newInstance("jimo");

3.clone()

1

4.反序列化

注意,我们采用的实现Serializable接口的方式:

1
2
3
4
5
6
7
8
9
10
11
12
// 4. 序列化/反序列化

// write
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("User.file"));
out.writeObject(user4);
out.close();

// read
ObjectInputStream in = new ObjectInputStream(new FileInputStream("User.file"));
User user5 = (User) in.readObject();
System.out.println(user5.getName());

参考

  1. Java对象的序列化与反序列化
  2. Java中创建对象的方式