日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java new关键字和newInstance()方法的区别

發(fā)布時間:2025/3/12 java 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java new关键字和newInstance()方法的区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、類的加載方式不同

在執(zhí)行Class.forName(“a.class.Name”)時,JVM會在classapth中去找對應(yīng)的類并加載,這時JVM會執(zhí)行該類的靜態(tài)代碼段。在使用newInstance()方法的時候,必須保證這個類已經(jīng)加載并且已經(jīng)連接了,而這可以通過Class的靜態(tài)方法forName()來完成的。使用關(guān)鍵字new創(chuàng)建一個類的時候,這個類可以沒有被加載,一般也不需要該類在classpath中設(shè)定,但可能需要通過classlaoder來加載。

2、所調(diào)用的構(gòu)造方法不盡相同

new關(guān)鍵字能調(diào)用任何構(gòu)造方法。

newInstance()只能調(diào)用無參構(gòu)造方法。

3、執(zhí)行效率不同

new關(guān)鍵字是強(qiáng)類型的,效率相對較高。

newInstance()是弱類型的,效率相對較低。

既然使用newInstance()構(gòu)造對象的地方通過new關(guān)鍵字也可以創(chuàng)建對象,為什么又會使用newInstance()來創(chuàng)建對象呢?

假設(shè)定義了一個接口Door,開始的時候是用木門的,定義為一個類WoodenDoor,在程序里就要這樣寫 Door door = new WoodenDoor() 。假設(shè)后來生活條件提高,換為自動門了,定義一個類AutoDoor,這時程序就要改寫為 Door door = new AutoDoor() 。雖然只是改個標(biāo)識符,如果這樣的語句特別多,改動還是挺大的。于是出現(xiàn)了工廠模式,所有Door的實(shí)例都由DoorFactory提供,這時換一種門的時候,只需要把工廠的生產(chǎn)模式改一下,還是要改一點(diǎn)代碼。

而如果使用newInstance(),則可以在不改變代碼的情況下,換為另外一種Door。具體方法是把Door的具體實(shí)現(xiàn)類的類名放到配置文件中,通過newInstance()生成實(shí)例。這樣,改變另外一種Door的時候,只改配置文件就可以了。示例代碼如下:

String className = 從配置文件讀取Door的具體實(shí)現(xiàn)類的類名;

Door door = (Door) Class.forName(className).newInstance();

再配合依賴注入的方法,就提高了軟件的可伸縮性、可擴(kuò)展性。

---------------------------------------------------

用newInstance與用new是區(qū)別的,區(qū)別在于創(chuàng)建對象的方式不一樣,前者是使用類加載機(jī)制,那么為什么會有兩種創(chuàng)建對象方式?這個就要從可伸縮、可擴(kuò)展,可重用等軟件思想上解釋了。Java中工廠模式經(jīng)常使用newInstance來創(chuàng)建對象,因此從為什么要使用工廠模式上也可以找到具體答案。
例如:
Class c = Class.forName(“A”);
factory = (AInterface)c.newInstance();
其中AInterface是A的接口,如果下面這樣寫,你可能會理解:
String className = “A”;
Class c = Class.forName(className);
factory = (AInterface)c.newInstance();
進(jìn)一步,如果下面寫,你可能會理解:
String className = readfromXMlConfig;//從xml 配置文件中獲得字符串
Class c = Class.forName(className);factory = (AInterface)c.newInstance();
上面代碼就消滅了A類名稱,優(yōu)點(diǎn):無論A類怎么變化,上述代碼不變,甚至可以更換A的兄弟類B , C , D….等,只要他們繼承Ainterface就可以。
從jvm的角度看,我們使用new的時候,這個要new的類可以沒有加載;
但是使用newInstance時候,就必須保證:
1、這個類已經(jīng)加載;
2、這個類已經(jīng)連接了。而完成上面兩個步驟的正是class的靜態(tài)方法forName()方法,這個靜態(tài)方法調(diào)用了啟動類加載器(就是加載javaAPI的那個加載器)。
有了上面jvm上的理解,那么我們可以這樣說,newInstance實(shí)際上是把new這個方式分解為兩步,即,首先調(diào)用class的加載方法加載某個類,然后實(shí)例化。
這樣分步的好處是顯而易見的。我們可以在調(diào)用class的靜態(tài)加載方法forName時獲得更好的靈活性,提供給了我們降耦的手段。

[補(bǔ)充:]
newInstance: 弱類型。低效率。只能調(diào)用無參構(gòu)造。
new: 強(qiáng)類型。相對高效。能調(diào)用任何public構(gòu)造。
newInstance()是實(shí)現(xiàn)IOC、反射、依賴倒置 等技術(shù)方法的必然選擇,new 只能實(shí)現(xiàn)具體類的實(shí)例化,不適合于接口編程。類里面就是通過這個類的默認(rèn)構(gòu)造函數(shù)構(gòu)建了一個對象,如果沒有默認(rèn)構(gòu)造函數(shù)就拋出InstantiationException, 如果沒有訪問默認(rèn)構(gòu)造函數(shù)

總結(jié)

以上是生活随笔為你收集整理的Java new关键字和newInstance()方法的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。