首頁  >  文章  >  Java  >  細數Java中創建物件的方式

細數Java中創建物件的方式

伊谢尔伦
伊谢尔伦原創
2017-05-22 23:10:091527瀏覽

Java的開發者們每天創建很多對象,但是通常使用依賴注入的方式管理系統,例如:Spring去創建對象,然而這裡有很多創建對象的方法:使用New關鍵字、使用Class類的newInstance方法、使用Constructor類別的newInstance方法、使用Clone方法、使用反序列化。

使用new關鍵字:這是我們最常見的也是最簡單的創建物件的方式,透過這種方式我們也可以呼叫任意的夠讚函數(無參的和有參的)。例如:Student student = new Student();

使用Class類別的newInstance方法:我們也可以使用Class類別的newInstance方法建立對象,這個newInstance方法呼叫無參的建構器來建立對象,如:Student student2 = (Student)Class.forName("根路徑.Student").newInstance(); 或:Student stu = Student.class.newInstance();

使用Constructor類別的newInstance方法:本方法和Class類別的newInstance方法很像,java.lang.relect.Constructor類別裡也有一個newInstance方法可以建立物件。我們可以透過這個newInstance方法來呼叫有參數的和私有的建構子。如: Constructor constructor = Student.class.getInstance(); Student stu = constructor.newInstance(); 這兩種newInstance的方法就是大家所說的反射,事實上Class的newInstance方法內部呼叫Constructor的newInstance方法就是大家所說的反射,事實上Class的newInstance方法內部呼叫Constructor的newInstance方法。這也是眾多框架Spring、Hibernate、Struts等使用後者的原因。

使用Clone的方法:無論何時我們調用一個對象的clone方法,JVM就會創建一個新的對象,將前面的對象的內容全部拷貝進去,用clone方法創建對象並不會調用任何構造函數。要使用clone方法,我們必須先實作Cloneable介面並實作其定義的clone方法。如:Student stu2 = stu.clone();這也是原型模式的應用。

使用反序列化:當我們序列化和反序列化一個對象,JVM會給我們創建一個單獨的對象,在反序列化時,JVM創建對象並不會調用任何構造函數。為了反序列化一個對象,我們需要讓我們的類別實作Serializable介面。如:ObjectInputStream in = new ObjectInputStream (new FileInputStream("data.obj")); Student stu3 = (Student)in.readObject();

  從上面的例子可以看出來,除了使用new關鍵字以外的其他方法全部都是轉變為invokevirtual(創建物件的直接方法),使用被new的方式轉變為兩個調用,new和invokespecial(建構函數調用)。

另外:兩種newInstance方法有沒有差別?

     ☆ Class類別位於java的lang套件中,而建構器類別是java反射機制的一部份。

  ☆ Class類別的newInstance只能觸發無參數的建構方法建立對象,而建構器類別的newInstance能觸發有參數或任意參數的建構方法來建立物件。

  ☆ Class類別的newInstance需要其建構方法是共有的或對呼叫方法可見的,而建構器類別的newInstance可以在特定環境下呼叫私有建構方法來建立物件。

  ☆ Class類別的newInstance拋出類別建構子的異常,而建構子類別的newInstance包裝了一個InvocationTargetException異常。

  Class類別本質上呼叫了反射包建構器類別中無參數的newInstance方法,捕獲了InvocationTargetException,將建構器本身的異常拋出。

【相關推薦】

1. 簡單介紹幾個java的物件

2. 實例詳解java物件拷貝

3. 針對java物件複製的實例詳解

以上是細數Java中創建物件的方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn