Java中創建對象的6種方式

背景

本文教你創建對象的 6 種方式,從低端到高端,各種創建方式,總有一個適合你,沒有對象的自己生成一個吧!

創建對象的 6 種方式

假設有個女朋友類:

@Data
@NoArgsConstructor
@AllArgsConstructor
class GirlFriend {
 
 private String name;
 
}

註解使用的是 Lombok 框架註解,方便快速開發

方法1:new 一個對象

沒對象就 new 一個吧,沒錯,使用 new 關鍵字,這也是 Java 創建對象最簡單直接的方式瞭。

示例代碼:

@Test
public void girlFriend1() {
    GirlFriend girlFriend = new GirlFriend("new一個對象");
    System.out.println(girlFriend);
}

輸出結果:

GirlFriend(name=new一個對象)

方法2:克隆一個對象

朋友有女朋友,你沒有,如果可以,把別人的女朋友克隆一個吧?

讓女朋友類先實現 Cloneable 接口,並且實現其 clone() 方法:

@Data
@NoArgsConstructor
@AllArgsConstructor
class GirlFriend implements Cloneable {
 
 private String name;
 
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    
}

註意:這裡演示默認使用的是淺拷貝,即隻克隆基本類型的字段,引用類型的需要再重寫 clone() 方法手動賦下引用字段的值。

現在克隆一個對象,示例代碼:

@Test
public void girlFriend2() throws CloneNotSupportedException {
    GirlFriend girlFriend1 = new GirlFriend("克隆一個對象");
    GirlFriend girlFriend2 = (GirlFriend) girlFriend1.clone();
    System.out.println(girlFriend2);
}

輸出結果:

GirlFriend(name=克隆一個對象)

使用克隆的好處就是可以快速創建一個和原對象值一樣的對象,對象的字段值一樣,但是兩個不同的引用。

方法3:類派發一個對象(反射)

直接使用女朋友類派發一個吧:

@Test
public void girlFriend3() throws InstantiationException, IllegalAccessException {
    GirlFriend girlFriend = GirlFriend.class.newInstance();
    girlFriend.setName("類派發一個對象");
    System.out.println(girlFriend);
}

輸出結果:

GirlFriend(name=類派發一個對象)

方法4:動態加載一個對象(反射)

知道女朋友類在哪裡(類全路徑),但卻沒有被加載,那就反射一個對象吧:

@Test
public void girlFriend4() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
    GirlFriend girlFriend = (GirlFriend) Class.forName("cn.javastack.test.jdk.core.GirlFriend").newInstance();
    girlFriend.setName("反射一個對象");
    System.out.println(girlFriend);
}

輸出結果:

GirlFriend(name=反射一個對象)

方法5:構造一個對象(反射)

知道女朋友類的構造,就可以調用構造器構造一個對象:

@Test
public void girlFriend5() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
    GirlFriend girlFriend = GirlFriend.class.getConstructor().newInstance();
    girlFriend.setName("構造一個對象");
    System.out.println(girlFriend);
}

輸出結果:

GirlFriend(name=構造一個對象)

這裡也可以同時結合類全路徑構造一個對象。

方法6:反序列化一個對象

這個和克隆的作用類似,假如以前序列化(保存)瞭一個女朋友在磁盤上,現在就可以反序列化出來。

首先讓女朋友可序列化,實現 Serializable 接口:

@Data
@NoArgsConstructor
@AllArgsConstructor
class GirlFriend implements Cloneable, Serializable {
 
    private static final long serialVersionUID = 1L;
    
    private String name;
 
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
 
}

序列化/反序列化對象示例代碼:

@Test
public void girlFriend6() throws IOException, ClassNotFoundException {
    GirlFriend girlFriend1 = new GirlFriend("反序列化一個對象");
 
    // 序列化一個女朋友
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("gf.obj"));
    objectOutputStream.writeObject(girlFriend1);
    objectOutputStream.close();
 
    // 反序列化出來
    ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("gf.obj"));
    GirlFriend girlFriend2 = (GirlFriend) objectInputStream.readObject();
    objectInputStream.close();
 
    System.out.println(girlFriend2);
}

輸出結果:

GirlFriend(name=反序列化一個對象)

總結

到此這篇關於Java中創建對象的6種方式的文章就介紹到這瞭,更多相關Java創建對象內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: