Java中五種不同方法的建立對象_java

來源:互聯網
上載者:User

前言

作為Java開發人員,我們每天都會建立大量的對象,但是,我們總是使用管理依賴系統(如Spring架構)來建立這些對象。其實還有其他方法可以建立對象,在接下來的文章中我會進行詳細介紹。

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.使用建構函式類的 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() 方法被認為是建立對象的反射手段。實際上,內部類的newInstance()方法使用建構函式類的 newInstance() 方法。這就是為什麼後者是首選並且使用不同的架構如Spring, Hibernate, Struts等。

4.使用clone方法

實際上無論何時我們調用clone方法,JAVA虛擬機器都為我們建立了一個新的對象並且複製了之前對象的內容到這個新的對象中。使用 clone方法建立對象不會調用任何建構函式。

為了在對象中使用clone()方法,我們需要在其中實現可複製類型並定義clone方法。

Employee emp4 = (Employee) emp3.clone();162: invokevirtual #87 // Method org/programming/mitra/exercises/Employee.clone ()Ljava/lang/Object;

5.使用還原序列化

無論何時我們對一個對象進行序列化和還原序列化,JAVA虛擬機器都會為我們建立一個單獨的對象。在還原序列化中,JAVA虛擬機器不會使用任何建構函式來建立對象。

對一個對象進行序列化需要我們在類中實現可序列化的介面。

ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));Employee emp5 = (Employee) in.readObject();261: invokevirtual #118  // Method java/io/ObjectInputStream.readObject:()Ljava/lang/Object;

正如我們在以上的位元組程式碼片段中所看到的,除第一種被轉換為一個新的函數和一個 invokespecial 指令以外,其它4種方法都被調用並轉換為invokevirtual

樣本

讓我們來看看準備建立對象的 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對象。

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 : -1968815046Employee Constructor Called...Employee [name=Rishi], hashcode : 78970652Employee Constructor Called...Employee [name=Yogesh], hashcode : -1641292792Employee [name=Atul], hashcode : 2051657Employee [name=Akash], hashcode : 63313419

以上內容是關於java建立對象的5種不同方法,希望給大家學習java時有所協助。也謝謝大家對雲棲社區的支援。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.