欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實例化對象的?7種方式詳解

 更新時間:2025年05月21日 10:59:24   作者:悟能不能悟  
在?Java?中,實例化對象的方式有多種,具體取決于場景需求和設計模式,本文整理了7種常用的方法,文中的示例代碼講解詳細,有需要的可以了解下

在 Java 中,實例化對象的方式有多種,具體取決于場景需求和設計模式。以下是 ?7 種核心對象實例化方式及其原理、適用場景與代碼示例:

1. ?new 關鍵字(直接構造)?

?原理?:通過調用類的構造函數(shù)直接創(chuàng)建對象。

?特點?:最常見、最高效的方式,但耦合性較高。

?示例?:

User user = new User("Alice", 30);

2. ?反射(Reflection)??

原理?:利用 Class 類或 Constructor 類的 newInstance() 方法動態(tài)創(chuàng)建對象。

?特點?:適用于運行時動態(tài)加載類(如框架中),但性能較低,且會繞過編譯期檢查。

?示例?:

// 方式1:使用 Class.newInstance()(已廢棄,僅支持無參構造)
Class<?> clazz = Class.forName("com.example.User");
User user = (User) clazz.newInstance();
 
// 方式2:使用 Constructor.newInstance()(推薦)
Constructor<User> constructor = clazz.getConstructor(String.class, int.class);
User user = constructor.newInstance("Bob", 25);

3. ?克?。–lone)??

?原理?:通過實現(xiàn) Cloneable 接口并重寫 clone() 方法復制現(xiàn)有對象。

?特點?:分為淺拷貝(默認)和深拷貝,需注意引用類型字段的復制。

?示例?:

class User implements Cloneable {
    @Override
    public User clone() throws CloneNotSupportedException {
        return (User) super.clone();
    }
}
User user1 = new User("Charlie", 28);
User user2 = user1.clone();

4. ?反序列化(Deserialization)??

?原理?:從字節(jié)流(如文件、網(wǎng)絡)中恢復對象,需實現(xiàn) Serializable 接口。

?特點?:用于持久化或跨網(wǎng)絡傳輸對象,不調用構造函數(shù)。

?示例?:

try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("user.ser"))) {
    User user = (User) in.readObject();
}

5. ?工廠模式(Factory Method)??

?原理?:通過工廠類封裝對象創(chuàng)建邏輯,解耦調用方與具體實現(xiàn)。

?場景?:需要靈活切換對象類型或隱藏創(chuàng)建細節(jié)時使用。

?示例?:

public interface UserFactory {
    User createUser(String name, int age);
}
 
public class DefaultUserFactory implements UserFactory {
    @Override
    public User createUser(String name, int age) {
        return new User(name, age);
    }
}
 
// 使用
UserFactory factory = new DefaultUserFactory();
User user = factory.createUser("Dave", 35);

6. ?Builder 模式?

?原理?:通過鏈式調用逐步構建復雜對象,提升代碼可讀性。

場景?:適用于多參數(shù)、可選參數(shù)或需要不可變對象的場景。

?示例?:

public class User {
    private final String name;
    private final int age;
 
    private User(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
    }
 
    public static class Builder {
        private String name;
        private int age;
 
        public Builder name(String name) {
            this.name = name;
            return this;
        }
 
        public Builder age(int age) {
            this.age = age;
            return this;
        }
 
        public User build() {
            return new User(this);
        }
    }
}
 
// 使用
User user = new User.Builder().name("Eve").age(40).build();

7. ?依賴注入(Dependency Injection)??

?原理?:由容器(如 Spring)管理對象生命周期并注入依賴。

?場景?:企業(yè)級應用解耦的核心手段,支持單例、原型等作用域。

?示例?(Spring 注解方式):

@Component
public class UserService {
    private final UserRepository repository;
 
    @Autowired  // 由 Spring 容器注入實例
    public UserService(UserRepository repository) {
        this.repository = repository;
    }
}

其他邊緣方式(了解即可)

1.?Unsafe 類:通過 sun.misc.Unsafe 直接分配內存繞過構造函數(shù)。

User user = (User) Unsafe.getUnsafe().allocateInstance(User.class);

2.Lambda/MethodHandle?:通過方法句柄調用構造函數(shù)(Java 7+)。

3.?動態(tài)代理?:生成接口的代理對象(如 Proxy.newProxyInstance())。

關鍵總結

方式優(yōu)點缺點典型應用場景
new 關鍵字簡單高效耦合性高直接創(chuàng)建簡單對象
反射動態(tài)性高性能低,繞過編譯檢查框架、插件系統(tǒng)
克隆快速復制對象深拷貝需手動實現(xiàn)原型模式、對象復用
反序列化跨網(wǎng)絡/持久化恢復對象安全性風險,不調用構造函數(shù)緩存恢復、RPC 傳輸
工廠模式解耦創(chuàng)建邏輯需額外類多態(tài)對象創(chuàng)建
Builder 模式可讀性強,支持復雜對象構建代碼冗余多參數(shù)、不可變對象構建
依賴注入解耦與管理對象生命周期依賴容器環(huán)境企業(yè)級應用(如 Spring)

最佳實踐

?優(yōu)先選擇 new 和工廠模式?:在簡單場景中保持代碼直觀。

?**慎用反射和 Unsafe**?:除非必要(如框架開發(fā)),避免引入性能和安全問題。

?深拷貝需謹慎?:確保所有引用字段正確復制。

?依賴注入為主?:在復雜系統(tǒng)中使用 Spring 等容器管理對象生命周期。

通過合理選擇實例化方式,可以提升代碼的靈活性、可維護性和性能。

到此這篇關于Java實例化對象的?7種方式詳解的文章就介紹到這了,更多相關Java實例化對象內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • idea 查看一個類的所有子類以及子類的子類并以層級關系顯示

    idea 查看一個類的所有子類以及子類的子類并以層級關系顯示

    這篇文章主要介紹了idea 查看一個類的所有子類以及子類的子類并以層級關系顯示,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • java對象拷貝常見面試題及應答匯總

    java對象拷貝常見面試題及應答匯總

    在本篇文章里小編給大家整理的是關于java對象拷貝常見面試題的相關內容,需要的朋友們可以學習下。
    2020-02-02
  • 解決SpringBoot整合MybatisPlus分模塊管理遇到的bug

    解決SpringBoot整合MybatisPlus分模塊管理遇到的bug

    這篇文章主要介紹了解決SpringBoot整合MybatisPlus分模塊管理遇到的bug,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java去除空格、標點符號的方法實例

    java去除空格、標點符號的方法實例

    這篇文章主要給大家介紹了關于java去除空格、標點符號的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • 深入java對象復制的分析

    深入java對象復制的分析

    本篇文章是對java對象復制進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • Java中ArrayList初始化的四種方法詳解

    Java中ArrayList初始化的四種方法詳解

    這篇文章主要介紹了Java中ArrayList初始化的四種方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • SpringBoot發(fā)送短信驗證碼的實例

    SpringBoot發(fā)送短信驗證碼的實例

    第三方短信發(fā)送平臺有很多種,各個平臺有各自的優(yōu)缺點,在選擇的時候可以根據(jù)自己的具體實際情況定奪,本文主要介紹了SpringBoot發(fā)送短信驗證碼的實例,感興趣的可以了解一下
    2022-02-02
  • Java線程池的分析和使用詳解

    Java線程池的分析和使用詳解

    本篇文章主要介紹了Java線程池的分析和使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-11-11
  • Kotlin與java8的SAM轉換對比(進階)

    Kotlin與java8的SAM轉換對比(進階)

    這篇文章主要介紹了Kotlin與java8的SAM轉換對比,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • c#和java base64不一致的解決方法

    c#和java base64不一致的解決方法

    最近非常郁悶的處理這個base64的問題,同樣的一個圖片文件,在java和c#進行base64編碼后結果不一樣,苦惱了很久,下面這篇文章主要給大家介紹了關于c#和java base64不一致的解決方法,需要的朋友可以參考下
    2018-11-11

最新評論