国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

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

2019-11-26 14:02:26
字體:
來源:轉載
供稿:網友

前言

作為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時有所幫助。也謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 观塘区| 交城县| 广河县| 桐梓县| 胶州市| 平遥县| 勃利县| 政和县| 宁乡县| 巨野县| 七台河市| 额济纳旗| 桂林市| 文水县| 那坡县| 密云县| 徐州市| 和平区| 阳高县| 永丰县| 兴城市| 漳平市| 乌兰浩特市| 四子王旗| 黑水县| 修文县| 中西区| 赤壁市| 象山县| 手游| 桃园县| 隆子县| 仁怀市| 房产| 保康县| 望奎县| 黑河市| 时尚| 涿鹿县| 浑源县| 甘肃省|