java建立物件的方法:1、使用new關鍵字;2、使用Class類別的newInstance方法,可呼叫無參的建構子建立物件;3、使用Constructor類別的newInstance方法;4、使用clone方法;5、使用反序列化。
本教學操作環境:windows7系統、java8版、DELL G3電腦。
作為Java開發者,我們每天創建很多對象,但我們通常使用依賴管理系統,例如Spring去創建對象。然而這裡有很多創建物件的方法,我們會在這篇文章中學到。
Java中有5種創建物件的方式,下面給出它們的範例還有它們的字節碼
#使用new關鍵字 | } → 呼叫了建構子 |
使用Class類別的newInstance方法 | } → 呼叫了建構子 |
#使用Constructor類別的newInstance方法 | } → 呼叫了建構子 |
使用clone方法 | } → 沒有呼叫建構子 |
使用反序列化 | } → 沒有呼叫建構子 |
如果你執行了最後的程序,你會發現方法1,2,3用建構函式建立對象,方法4,5沒有呼叫建構子。
1.使用new關鍵字
這是最常見也是最簡單的建立物件的方式了。透過這種方式,我們可以呼叫任意的建構子(無參的和帶參數的)。
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方法呼叫無參的建構子建立物件。
我們可以透過下面方式呼叫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;
#3.使用Constructor類別的newInstance方法
和Class類別的newInstance方法很像, java.lang.reflect.Constructor類別裡也有一個newInstance方法可以建立物件。我們可以透過這個newInstance方法來呼叫有參數的和私有的建構子。
Constructor<Employee> 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方法的區別,請看這篇Creating objects through Reflection in Java with Example.
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;
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;
我們從上面的字節碼片段可以看到,除了第1個方法,其他4個方法全都轉變為invokevirtual(創建物件的直接方法),第一個方法轉變為兩個調用,new和invokespecial(建構函數調用)。
範例
讓我們看一看為下面這個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; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Employee other = (Employee) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } @Override public String toString() { return "Employee [name=" + name + "]"; } @Override 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> 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 Constructor Called... Employee [name=Rishi], hashcode : 78970652 Employee Constructor Called... Employee [name=Yogesh], hashcode : -1641292792 Employee [name=Atul], hashcode : 2051657 Employee [name=Akash], hashcode : 63313419
相關影片教學推薦:Java影片教學
以上是java怎麼創建對象的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 Linux新版
SublimeText3 Linux最新版

Dreamweaver CS6
視覺化網頁開發工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。