五種方法創建java對象,你知道幾種呢?


五種方法創建java對象

作為Java開發人員,我們通常每天都會創建許多對象,但是我們總是使用新的或依賴管理系統(例如Spring)來創建這些對象。但是,有更多方法可以創建本文中將要研究的對象。

用Java創建對象的共有5種核心方式,下面將以其示例加以說明,然后介紹創建對象的行的字節碼。但是,有很多API可以為我們創建對象,但是這些API還將間接使用這5種核心方式之一,例如Spring BeanFactory

 

 

如果您將執行最后給出的程序,則會看到方法1、2、3使用構造函數創建對象,而4、5沒有調用構造函數創建對象。

 

1.使用新關鍵字

這是創建對象的最常見和常規的方法,也是一種非常簡單的方法。通過使用此方法,我們可以調用要調用的任何構造函數(無參數的構造函數和參數化的)。

Employee emp1 = new Employee();

  

 

 

2.使用Class類的newInstance()方法

我們還可以使用Class類的newInstance()方法創建一個對象。此newInstance()方法調用no-arg構造函數來創建對象。

我們可以通過newInstance()通過以下方式創建對象:

Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee").newInstance();
Or

Employee emp2 = Employee.class.newInstance();

  

 

3.使用構造方法類的newInstance()方法

Class類的newInstance()方法類似,java.lang.reflect.Constructor類中有一個newInstance()方法可用於創建對象。我們還可以使用此newInstance()方法來調用參數化構造函數和私有構造函數。

Constructor<Employee> constructor = Employee.class.getConstructor();

Employee emp3 = constructor.newInstance();

  

 

這兩種newInstance()方法都被稱為創建對象的反射方式。實際上,Class類的newInstance()方法在內部使用了Constructor類的newInstance()方法。這就是為什么最好使用后一種方法,並且也將其用於諸如Spring,Hibernate,Struts等不同框架的原因。要了解這兩種newInstance()方法之間的區別,請閱讀使用Example在Java中通過Reflection創建對象。

 

4.使用clone()方法:

每當我們在任何對象上調用clone()時,JVM實際上都會為我們創建一個新對象,並將先前對象的所有內容復制到其中。使用clone方法創建對象不會調用任何構造函數。

要在對象上使用clone()方法,我們需要實現Cloneable並在其中定義clone()方法。

Employee emp4 = (Employee) emp3.clone();

  

 

Java克隆是Java社區中最值得探討的話題,它的確有其缺點,但是在對象完全滿足Java克隆的強制條件之前,它仍然是創建任何對象的副本的最流行和最簡單的方法。

 

5.使用反序列化

每當我們序列化然后反序列化一個對象時, JVM就會為我們創建一個單獨的對象。在反序列化中,JVM不使用任何構造函數來創建對象。要反序列化對象,我們需要在類中實現Serializable接口。

ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Employee emp5 = (Employee) in.readObject();

  

 

正如我們在上面的字節碼中看到的那樣,所有四個方法調用都轉換為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 boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Employee employee = (Employee) o;
        return Objects.equals(name, employee.name);
    }

    @Override
    public int hashCode() { return Objects.hash(name); }

    @Override
    public String toString() { return String.format("Employee{name='%s'}", 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 {

        // 1. Using new keyword
        Employee emp1 = new Employee();
        emp1.setName("emp1");


        // 2. Using Class class's newInstance() method
        Employee emp2 = Employee.class.newInstance();
        emp2.setName("emp2");


        // 3. Using Constructor class's newInstance() method
        Constructor<Employee> constructor = Employee.class.getConstructor();
        Employee emp3 = constructor.newInstance();
        emp3.setName("emp3");

        // 4. Using clone() method
        Employee emp4 = (Employee) emp3.clone();
        emp4.setName("emp4");


        // Serialization
        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.obj"))) {
            out.writeObject(emp4);
        }

        // 5. Using Deserialization
        Employee emp5;
        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"))) {
            emp5 = (Employee) in.readObject();
            emp5.setName("emp5");
        }

        System.out.println(emp1 + ", hashcode : " + emp1.hashCode());
        System.out.println(emp2 + ", hashcode : " + emp2.hashCode());
        System.out.println(emp3 + ", hashcode : " + emp3.hashCode());
        System.out.println(emp4 + ", hashcode : " + emp4.hashCode());
        System.out.println(emp5 + ", hashcode : " + emp5.hashCode());
    }
}

  

該程序將給出以下輸出:

Employee Constructor Called...
Employee Constructor Called...
Employee Constructor Called...
Employee{name='emp1'}, hashcode : 3117192
Employee{name='emp2'}, hashcode : 3117193
Employee{name='emp3'}, hashcode : 3117194
Employee{name='emp4'}, hashcode : 3117195
Employee{name='emp5'}, hashcode : 3117196

  

完整的Java初級,高級對應的學習路線和資料!專注於java開發。分享java基礎、原理性知識、JavaWeb實戰、spring全家桶、設計模式、分布式及面試資料、開源項目,助力開發者成長!


歡迎關注微信公眾號:碼邦主

 

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM