在Java中,创建对象有几种方式?一定要调用构造函数吗?
第一种:
- 用new关键字创建对象,需要使用构造器。
第二种:
-
反射:使用
Class类newInstance()方法。需要调用构造函数,调用的是无参构造方法。public class Test { public Test(){ System.out.println("初始化时直接调用"); } public static void main(String[] args) throws Exception { Test p = Test.class.newInstance(); System.out.println(p); } }
第三种:
-
反射:使用
Constructor类的newInstance()方法。需要调用构造函数,调用的是有参构造方法。import java.lang.reflect.Constructor; public class Test { public Test(String name) { System.out.println("name=" + name); } public static void main(String[] args) throws Exception { Class p1 = Class.forName("Test"); Constructor p2 = p1.getConstructor(String.class); Test p = (Test) p2.newInstance("张三"); System.out.println(p); // name=张三 } }关于反射的详解,参考本站另一篇文章:反射
第四种:
-
克隆
要使用clone方法, 必须先让被克隆的类实现Cloneable接口 并重写Object的clone方法。得到的对象是一个全新的对象,所以属于深克隆。此方法不需要调用构造函数。
public class Person implements Cloneable { @Override public Person clone() throws CloneNotSupportedException { return (Person) super.clone(); } }
public class Main { public static void main(String[] args) throws Exception { Person person = new Person(); Object clone = person.clone();
System.out.println(person == clone); //false
}
}
> 关于克隆的详解,参考本站另一篇文章:[克隆](https://hsyu.cn/2021/11/2639497952.html)
>
<br>
<br>
#### 第五种:
- 使用反序列化
此方法也不需要调用构造函数。这种方法特别耗内存。
```javascript
import org.apache.commons.lang3.SerializationUtils;
public class Main {
public static void main(String[] args) throws Exception {
Person person = new Person();
byte[] bytes = SerializationUtils.serialize(person);
Object deserPerson = SerializationUtils.deserialize(bytes);
System.out.println(person == deserPerson); //false
}
}
关于序列化与反序列化的详解,参考本站另一篇文章:序列化与反序列化
cloud.tencent.com/developer/a… zhuanlan.zhihu.com/p/106836536