程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中五種分歧辦法的創立對象

Java中五種分歧辦法的創立對象

編輯:關於JAVA

Java中五種分歧辦法的創立對象。本站提示廣大學習愛好者:(Java中五種分歧辦法的創立對象)文章只能為提供參考,不一定能成為您想要的結果。以下是Java中五種分歧辦法的創立對象正文


媒介

作為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 : -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創立對象的5種分歧辦法,願望給年夜家進修java時有所贊助。也感謝年夜家對的支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved