用Java建立物件的5種不同方式
java怎麼建立一個物件
作為Java開發人員,我們通常每天建立許多物件,但是我們始終使用依賴管理系統(例如Spring)來建立這些物件。但是,還有更多建立物件的方法,我們將在本文中進行研究。
用Java建立物件的共有五種方法,下面將透過示例說明這些方法,然後介紹建立物件的行的位元組碼。
如果您將執行最後給出的程式,您將看到方法1、2、3使用建構函式建立物件,而4、5沒有呼叫建構函式建立物件。
1。使用新關鍵字
這是建立物件的最常見和常規的方法,也是一種非常簡單的方法。透過使用此方法,我們可以呼叫要呼叫的任何建構函式(無引數的建構函式和引數化的)。
Employee emp1 = new Employee();
0: new #19 // class org/programming/mitra/exercises/Employee
3: dup
4: invokespecial #21 // Method org/programming/mitra/exercises/Employee。“”:()V
2。使用Class類的newInstance()方法
我們還可以使用Class類的newInstance()方法建立一個物件。此newInstance()方法呼叫no-arg建構函式來建立物件。
我們可以透過newInstance()透過以下方式建立物件:
Employee emp2 = (Employee) Class。forName(“org。programming。mitra。exercises。Employee”)。newInstance();
要麼
Employee emp2 = Employee。class。newInstance();
51: invokevirtual #70 // Method java/lang/Class。newInstance:()Ljava/lang/Object;
4。使用構造方法類的newInstance()方法
與Class類的newInstance()方法類似,java。lang。reflect。Constructor類中有一個newInstance()方法可用於建立物件。我們還可以使用此newInstance()方法來呼叫引數化建構函式和私有建構函式。
Constructor
Employee emp3 = constructor。newInstance();
111: invokevirtual #80 // Method java/lang/reflect/Constructor。newInstance:([Ljava/lang/Object;)Ljava/lang/Object;
這兩種newInstance()方法都被稱為建立物件的反射方式。實際上,Class類的newInstance()方法在內部使用了Constructor類的newInstance()方法。這就是為什麼最好使用後一種方法,並在Spring,Hibernate,Struts等不同框架中使用後一種方法的原因。要了解這兩種newInstance()方法之間的區別,請閱讀 使用Example在Java中透過反射建立物件。
4。使用clone()方法:
每當我們在任何物件上呼叫clone()時,JVM實際上都會為我們建立一個新物件,並將先前物件的所有內容複製到其中。使用clone方法建立物件不會呼叫任何建構函式。
要在物件上使用clone()方法,我們需要實現Cloneable並在其中定義clone()方法。
Employee emp4 = (Employee) emp3。clone();
162: invokevirtual #87 // Method org/programming/mitra/exercises/Employee。clone ()Ljava/lang/Object;
Java克隆是Java社群中最值得商topic的話題,它當然也有其缺點,但是在物件完全滿足Java克隆的強制條件之前,它仍然是建立任何物件副本的最流行和最簡單的方法。我已經在長達3篇文章的Java克隆系列中詳細介紹了 克隆 ,其中包括(Java克隆和克隆型別(淺和深),例如,Java克隆-複製構造器與克隆,Java克隆-甚至複製構造器都不充分)。),如果您想進一步瞭解克隆,請繼續閱讀。
5。使用反序列化:
每當我們序列化和反序列化一個物件時,JVM都會為我們建立一個單獨的物件。在反序列化中,JVM不使用任何建構函式來建立物件。
為了反序列化一個物件,我們需要在我們的類中實現一個Serializable介面。
ObjectInputStream in = new ObjectInputStream(new FileInputStream(“data。obj”));
Employee emp5 = (Employee) in。readObject();
261: invokevirtual #118 // Method java/io/ObjectInputStream。readObject:()Ljava/lang/Object;
正如我們在上面的位元組碼片段中看到的,invokevirtual 除了第一個方法被轉換為兩個呼叫之外,所有四個方法都被呼叫並轉換為 (這些方法直接處理物件的建立):一個是新的,另一個是 invokespecial (呼叫建構函式)。
我已經在我的文章“用示例解釋的Java序列化的一切”中詳細討論了序列化和反序列化,如果您想了解更多有關序列化和反序列化的資訊 ,請繼續閱讀。
例
讓我們考慮一個我們要為其建立物件的Employee類:
class Employee implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
private String name;
public Employee() {
System。out。println(“Employee Constructor Called。。。”);
}
public String getName() {
return name;
public void setName(String name) {
this。name = name;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name。hashCode());
return result;
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj。getClass())
Employee other = (Employee) obj;
if (name == null) {
if (other。name != null)
return false;
} else if (!name。equals(other。name))
return true;
public String toString() {
return “Employee [name=” + name + “]”;
public Object clone() {
Object obj = null;
try {
obj = super。clone();
} catch (CloneNotSupportedException e) {
e。printStackTrace();
}
return obj;
}
在下面的Java程式中,我們將以所有5種方式建立Employee物件。您也可以在GitHub上找到原始碼 。
public class ObjectCreation {
public static void main(String。。。 args) throws Exception {
// By using new keyword
Employee emp1 = new Employee();
emp1。setName(“Naresh”);
System。out。println(emp1 + “, hashcode : ” + emp1。hashCode());
// By using Class class‘s newInstance() method
Employee emp2 = (Employee) Class。forName(“org。programming。mitra。exercises。Employee”)
。newInstance();
// Or we can simply do this
// Employee emp2 = Employee。class。newInstance();
emp2。setName(“Rishi”);
System。out。println(emp2 + “, hashcode : ” + emp2。hashCode());
// By using Constructor class’s newInstance() method
Constructor
Employee emp3 = constructor。newInstance();
emp3。setName(“Yogesh”);
System。out。println(emp3 + “, hashcode : ” + emp3。hashCode());
// By using clone() method
Employee emp4 = (Employee) emp3。clone();
emp4。setName(“Atul”);
System。out。println(emp4 + “, hashcode : ” + emp4。hashCode());
// By using Deserialization
// Serialization
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(“data。obj”));
out。writeObject(emp4);
out。close();
//Deserialization
ObjectInputStream in = new ObjectInputStream(new FileInputStream(“data。obj”));
Employee emp5 = (Employee) in。readObject();
in。close();
emp5。setName(“Akash”);
System。out。println(emp5 + “, hashcode : ” + emp5。hashCode());
該程式將給出以下輸出:
Employee Constructor Called。。。
Employee [name=Naresh], hashcode : -1968815046
Employee [name=Rishi], hashcode : 78970652
Employee [name=Yogesh], hashcode : -1641292792
Employee [name=Atul], hashcode : 2051657
Employee [name=Akash], hashcode : 63313419
最後,開發這麼多年我也總結了一套學習Java的資料與面試題,如果你在技術上面想提升自己的話,可以關注我,私信傳送領取資料或者在評論區留下自己的聯絡方式,有時間記得幫我點下轉發讓跟多的人看到哦。