用Java建立物件的5種不同方式

java怎麼建立一個物件

作為Java開發人員,我們通常每天建立許多物件,但是我們始終使用依賴管理系統(例如Spring)來建立這些物件。但是,還有更多建立物件的方法,我們將在本文中進行研究。

用Java建立物件的5種不同方式

用Java建立物件的共有五種方法,下面將透過示例說明這些方法,然後介紹建立物件的行的位元組碼。

用Java建立物件的5種不同方式

如果您將執行最後給出的程式,您將看到方法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 constructor = Employee。class。getConstructor();

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 constructor = Employee。class。getConstructor();

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的資料與面試題,如果你在技術上面想提升自己的話,可以關注我,私信傳送領取資料或者在評論區留下自己的聯絡方式,有時間記得幫我點下轉發讓跟多的人看到哦。

用Java建立物件的5種不同方式

用Java建立物件的5種不同方式