最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)例化對(duì)象的?7種方式詳解

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

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

1. ?new 關(guān)鍵字(直接構(gòu)造)?

?原理?:通過(guò)調(diào)用類的構(gòu)造函數(shù)直接創(chuàng)建對(duì)象。

?特點(diǎn)?:最常見(jiàn)、最高效的方式,但耦合性較高。

?示例?:

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

2. ?反射(Reflection)??

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

?特點(diǎn)?:適用于運(yùn)行時(shí)動(dòng)態(tài)加載類(如框架中),但性能較低,且會(huì)繞過(guò)編譯期檢查。

?示例?:

// 方式1:使用 Class.newInstance()(已廢棄,僅支持無(wú)參構(gòu)造)
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)??

?原理?:通過(guò)實(shí)現(xiàn) Cloneable 接口并重寫 clone() 方法復(fù)制現(xiàn)有對(duì)象。

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

?示例?:

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)絡(luò))中恢復(fù)對(duì)象,需實(shí)現(xiàn) Serializable 接口。

?特點(diǎn)?:用于持久化或跨網(wǎng)絡(luò)傳輸對(duì)象,不調(diào)用構(gòu)造函數(shù)。

?示例?:

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

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

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

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

?示例?:

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 模式?

?原理?:通過(guò)鏈?zhǔn)秸{(diào)用逐步構(gòu)建復(fù)雜對(duì)象,提升代碼可讀性。

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

?示例?:

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)管理對(duì)象生命周期并注入依賴。

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

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

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

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

1.?Unsafe 類:通過(guò) sun.misc.Unsafe 直接分配內(nèi)存繞過(guò)構(gòu)造函數(shù)。

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

2.Lambda/MethodHandle?:通過(guò)方法句柄調(diào)用構(gòu)造函數(shù)(Java 7+)。

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

關(guān)鍵總結(jié)

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

最佳實(shí)踐

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

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

?深拷貝需謹(jǐn)慎?:確保所有引用字段正確復(fù)制。

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

通過(guò)合理選擇實(shí)例化方式,可以提升代碼的靈活性、可維護(hù)性和性能。

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

相關(guān)文章

  • java實(shí)現(xiàn)圖的鄰接表存儲(chǔ)結(jié)構(gòu)的兩種方式及實(shí)例應(yīng)用詳解

    java實(shí)現(xiàn)圖的鄰接表存儲(chǔ)結(jié)構(gòu)的兩種方式及實(shí)例應(yīng)用詳解

    這篇文章主要介紹了java實(shí)現(xiàn)圖的鄰接表存儲(chǔ)結(jié)構(gòu)的兩種方式及實(shí)例應(yīng)用詳解,鄰接表構(gòu)建圖是必須需要一個(gè)Graph對(duì)象,也就是圖對(duì)象!該對(duì)象包含屬性有:頂點(diǎn)數(shù)、邊數(shù)以及圖的頂點(diǎn)集合,需要的朋友可以參考下
    2019-06-06
  • Spring Boot 中的 SockJS原理及使用方法

    Spring Boot 中的 SockJS原理及使用方法

    SockJS 的主要作用是提供一種 WebSocket 的兼容性解決方案,使得不支持 WebSocket 的瀏覽器也可以使用 WebSocket,本文介紹了Spring Boot中的SockJS,包括SockJS的原理,使用方法和示例代碼,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • Java ThreadLocal的設(shè)計(jì)理念與作用

    Java ThreadLocal的設(shè)計(jì)理念與作用

    這篇文章主要介紹了Java ThreadLocal的設(shè)計(jì)理念與作用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java流形式返回前端的實(shí)現(xiàn)示例

    Java流形式返回前端的實(shí)現(xiàn)示例

    ? Java后端開(kāi)發(fā)項(xiàng)目時(shí),需要給前端傳一些數(shù)據(jù),本文主要介紹了Java流形式返回前端的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • MyBatis-Plus 插件擴(kuò)展的實(shí)現(xiàn)

    MyBatis-Plus 插件擴(kuò)展的實(shí)現(xiàn)

    MyBatis-Plus通過(guò)插件擴(kuò)展機(jī)制增強(qiáng)功能,基于MyBatis Interceptor攔截器,包括分頁(yè)插件、邏輯刪除、SQL性能分析和樂(lè)觀鎖等,開(kāi)發(fā)者可自定義插件以適應(yīng)特定需求,有效地增強(qiáng)SQL執(zhí)行過(guò)程的控制和優(yōu)化,同時(shí)注意插件使用的性能影響和執(zhí)行順序
    2024-09-09
  • Mybatis ResultMap映射、多表查詢與緩存機(jī)制詳解

    Mybatis ResultMap映射、多表查詢與緩存機(jī)制詳解

    本文詳細(xì)介紹了MyBatis中ResultMap的使用、多表查詢(包括一對(duì)一和一對(duì)多關(guān)系)以及分步查詢和分頁(yè)查詢,此外,還探討了MyBatis的緩存機(jī)制,包括一級(jí)緩存和二級(jí)緩存,通過(guò)這些內(nèi)容,讀者可以全面掌握如何在MyBatis中進(jìn)行復(fù)雜的數(shù)據(jù)查詢和緩存管理,感興趣的朋友一起看看吧
    2025-10-10
  • 深入理解框架背后的原理及源碼分析

    深入理解框架背后的原理及源碼分析

    這篇文章來(lái)為大家深入的介紹了框架背后的原理及源碼分析,希望大家能夠更深層次的理解并使用好框架,在此與君共勉,框架雖好,但不要丟了其背后的原理
    2022-01-01
  • Spring集成MyBatis框架

    Spring集成MyBatis框架

    本文主要介紹了Spring集成MyBatis的配置和使用,項(xiàng)目基于Maven構(gòu)建,連接Mysql數(shù)據(jù)庫(kù)。下面跟著小編一起來(lái)看下吧
    2017-02-02
  • SpringBoot yml配置文件讀取方法詳解

    SpringBoot yml配置文件讀取方法詳解

    這篇文章主要介紹了SpringBoot yml配置文件讀取方法,項(xiàng)目開(kāi)發(fā)中難免要讀取配置文件,本文結(jié)合開(kāi)發(fā)經(jīng)驗(yàn)介紹幾種使用過(guò)的讀取配置文件的方法
    2022-10-10
  • java的JIT 工作原理簡(jiǎn)單介紹

    java的JIT 工作原理簡(jiǎn)單介紹

    這篇文章主要介紹了java的JIT 工作原理簡(jiǎn)單介紹的相關(guān)資料,需要的朋友可以參考下
    2017-03-03

最新評(píng)論

中西区| 定襄县| 凤城市| 鄂托克旗| 平武县| 张家界市| 清苑县| 东安县| 长治市| 雷州市| 嘉义县| 靖江市| 青神县| 元朗区| 囊谦县| 玉田县| 通化市| 垦利县| 永安市| 泰兴市| 静海县| 江达县| 中卫市| 丁青县| 高要市| 诸暨市| 山丹县| 五峰| 阿克陶县| 江安县| 浦城县| 南通市| 沙田区| 新宁县| 麻阳| 江川县| 祥云县| 汾阳市| 宁明县| 尚志市| 隆子县|