Java创建对象的五种方式
- new 关键字
- 反射()
- Constructor.newInstance
- 克隆(Clone方法)
- 反序列化
- 动态代理
1、new关键字
通过new关键字来实例化对象是最简单的创建对象的方式,该方式可以调用任意的构造器来创建实例。
public class Main {
public static void main(String[] args) {
City city= new City();
}
}
2、Class.newInstance
这是我们运用反射创建对象时最常用的方法。Class类的newInstance使用的是类的public的无参构造器。
public class Main {
public static void main(String[] args) throws Exception {
City city= City.class.newInstance();
}
}
3、Constructor.newInstance
Constructor.newInstance比Class.newInstance强大。可以通过该方法调用有参数和私有的构造函数。不再局限于必须是无参且公共的。
public class Main {
public static void main(String[] args) throws Exception {
// 包括public的和非public的,当然也包括private的
Constructor<?>[] declaredConstructors = City.class.getDeclaredConstructors();
// 只返回public的~~~~~~(返回结果是上面的子集)
Constructor<?>[] constructors = City.class.getConstructors();
Constructor<?> noArgsConstructor = declaredConstructors[0];
Constructor<?> haveArgsConstructor = declaredConstructors[1];
noArgsConstructor.setAccessible(true); // 非public的构造必须设置true才能用于创建实例
Object city1= noArgsConstructor.newInstance();
Object city2= declaredConstructors[1].newInstance("湖北", "武汉");
System.out.println(person1);
System.out.println(person2);
}
}
输出:
City{province="null",city="null"}
City{province="湖北",city="武汉"}
4、Clone
无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。
因为Object的clone方法是protected的,所以要使用clone方法,我们必须先实现Cloneable接口并复写Object的clone方法
public class City implements Cloneable {
...
// 访问权限写为public,并且返回值写为city
@Override
public City clone() throws CloneNotSupportedException {
return (City) super.clone();
}
...
}
public class Main {
public static void main(String[] args) throws Exception {
City city = new City("湖北", "武汉");
Object clone = city.clone();
System.out.println(city);
System.out.println(clone);
System.out.println(city == clone); //false
}
}
输出:
City{province="湖北",city="武汉"}
City{province="湖北",city="武汉"}
false
5、反序列化
当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数。
为了反序列化一个对象,我们需要让我们的类实现Serializable接口。
public class Main {
public static void main(String[] args) throws Exception {
City city = new City("湖北", "武汉");
byte[] bytes = SerializationUtils.serialize(city);
// 字节数组:可以来自网络、可以来自文件(本处直接本地模拟)
Object deserCity = SerializationUtils.deserialize(bytes);
System.out.println(city);
System.out.println(deserCity);
System.out.println(person == deserCity);
}
}
输出:
City{province="湖北",city="武汉"}
City{province="湖北",city="武汉"}
false
本文介绍了Java中创建对象的五种主要方式:使用new关键字、反射机制下的Class.newInstance及Constructor.newInstance方法、Clone方法以及反序列化。每种方式都有其特点与适用场景。
4286

被折叠的 条评论
为什么被折叠?



