亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中創(chuàng)建對象的5種方式總結

 更新時間:2017年02月08日 11:12:00   作者:Givefine  
本篇文章主要介紹了Java中創(chuàng)建對象的5種方式總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

作為Java開發(fā)者,我們每天創(chuàng)建很多對象,但我們通常使用依賴管理系統,比如Spring去創(chuàng)建對象。然而這里有很多創(chuàng)建對象的方法,我們會在這篇文章中學到。

Java中有5種創(chuàng)建對象的方式,下面給出它們的例子還有它們的字節(jié)碼

使用new關鍵字 } → 調用了構造函數
使用Class類的newInstance方法 } → 調用了構造函數
使用Constructor類的newInstance方法 } → 調用了構造函數
使用clone方法 } → 沒有調用構造函數
使用反序列化 } → 沒有調用構造函數

作為Java開發(fā)者,我們每天創(chuàng)建很多對象,但我們通常使用依賴管理系統,比如Spring去創(chuàng)建對象。然而這里有很多創(chuàng)建對象的方法,我們會在這篇文章中學到。

Java中有5種創(chuàng)建對象的方式,下面給出它們的例子還有它們的字節(jié)碼

如果你運行了末尾的的程序,你會發(fā)現方法1,2,3用構造函數創(chuàng)建對象,方法4,5沒有調用構造函數。

1.使用new關鍵字

這是最常見也是最簡單的創(chuàng)建對象的方式了。通過這種方式,我們可以調用任意的構造函數(無參的和帶參數的)。

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方法創(chuàng)建對象。這個newInstance方法調用無參的構造函數創(chuàng)建對象。

我們可以通過下面方式調用newInstance方法創(chuàng)建對象: 

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方法可以創(chuàng)建對象。我們可以通過這個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方法的區(qū)別,

4.使用clone方法

無論何時我們調用一個對象的clone方法,jvm就會創(chuàng)建一個新的對象,將前面對象的內容全部拷貝進去。用clone方法創(chuàng)建對象并不會調用任何構造函數。

要使用clone方法,我們需要先實現Cloneable接口并實現其定義的clone方法。

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

5.使用反序列化

當我們序列化和反序列化一個對象,jvm會給我們創(chuàng)建一個單獨的對象。在反序列化時,jvm創(chuàng)建對象并不會調用任何構造函數。

為了反序列化一個對象,我們需要讓我們的類實現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;

我們從上面的字節(jié)碼片段可以看到,除了第1個方法,其他4個方法全都轉變?yōu)閕nvokevirtual(創(chuàng)建對象的直接方法),第一個方法轉變?yōu)閮蓚€調用,new和invokespecial(構造函數調用)。

例子

讓我們看一看為下面這個Employee類創(chuàng)建對象:

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種方式創(chuàng)建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泛型與數據庫應用實例詳解

    Java泛型與數據庫應用實例詳解

    這篇文章主要介紹了Java泛型與數據庫應用,結合實例形式詳細分析了java繼承泛型類實現增刪改查操作相關實現技巧,需要的朋友可以參考下
    2019-08-08
  • Java Map 在put值時value值不被覆蓋的解決辦法

    Java Map 在put值時value值不被覆蓋的解決辦法

    這篇文章主要介紹了Java Map 在put值時value值不被覆蓋的解決辦法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-04-04
  • Java實現文件上傳至服務器的方法

    Java實現文件上傳至服務器的方法

    這篇文章主要為大家詳細介紹了Java實現文件上傳至服務器的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java 常見異常(Runtime Exception )詳細介紹并總結

    Java 常見異常(Runtime Exception )詳細介紹并總結

    這篇文章主要介紹了Java 常見異常(Runtime Exception )詳細介紹并相關資料,大家在開發(fā)Java 應用軟件的時候經常會遇到各種異常這里幫大家整理了一部分,并解釋如何解決,需要的朋友可以參考下
    2016-10-10
  • Java網絡編程實現多線程聊天

    Java網絡編程實現多線程聊天

    這篇文章主要為大家詳細介紹了Java網絡編程實現多線程聊天,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java 多線程等待優(yōu)雅的實現方式之Phaser同步屏障

    Java 多線程等待優(yōu)雅的實現方式之Phaser同步屏障

    在JAVA 1.7引入了一個新的并發(fā)API:Phaser,一個可重用的同步barrier。在此前,JAVA已經有CyclicBarrier、CountDownLatch這兩種同步barrier,但是Phaser更加靈活,而且側重于 重用
    2021-11-11
  • Java中的泛型方法詳解及簡單實例

    Java中的泛型方法詳解及簡單實例

    這篇文章主要介紹了Java中的泛型方法詳細介紹的相關資料,需要的朋友可以參考下
    2016-12-12
  • maven多模塊項目依賴管理與依賴繼承詳解

    maven多模塊項目依賴管理與依賴繼承詳解

    這篇文章主要介紹了maven多模塊項目依賴管理與依賴繼承詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java?8?的異步編程利器?CompletableFuture的實例詳解

    Java?8?的異步編程利器?CompletableFuture的實例詳解

    這篇文章主要介紹了Java?8?的異步編程利器?CompletableFuture?詳解,本文通過一個例子給大家介紹下Java?8??CompletableFuture異步編程的相關知識,需要的朋友可以參考下
    2022-03-03
  • Java中為什么不同的返回類型不算方法重載

    Java中為什么不同的返回類型不算方法重載

    這篇文章主要介紹了Java中為什么不同的返回類型不算方法重載,方法重載是指在同一個類中,定義了多個同名方法,但每個方法的參數類型或者是參數個數不同就是方法重載,下文詳細介紹,需要的小伙伴可以參考一下
    2022-05-05

最新評論