newInstance() 和 new 的區別

1,創建對象的方式不一樣,前者是使用類加載機制 ,後者是創建一個新類.

newInstance( )是一個方法,而new是一個關鍵字

2, new創建一個類的時候,這個類可以沒有被加載。

但是使用newInstance()方法的時候,就必須保證:1、這個類已經加載;2、這個類已經連接了。

注:newInstance()實際上是把new這個方式分解為兩步,先調用Class加載方法加載某個類,然後實例化。

這樣分步的好處:可以在調用class的靜態加載方法forName時獲得更好的靈活性,

提供給了一種降耦(降低耦合度)的手段。(軟件工程中對象之間的耦合度就是對象之間的依賴性。指導使用和維護對象的主要問題是對象之間的多重依賴性。對象之間的耦合越高,維護成本越高。因此對象的設計應使類和構件之間的耦合最小。

Java中工廠模式經常使用newInstance()方法來創建對象,例如:

class c = Class.forName("Example");

factory = (ExampleInterface)c.newInstance();

其中ExampleInterface是Example的接口,可以寫成如下形式:

String className = "Example";

class c = Class.forName(className);

factory = (ExampleInterface)c.newInstance();

還可以寫成如下形式:

String className = readfromXMlConfig;//這裡是從從xml 配置文件中獲得字符串

class c = Class.forName(className);

factory = (ExampleInterface)c.newInstance();

上面代碼已經不存在Example的類名稱,它的優點是,無論Example類怎麼變化,上述代碼不變,甚至可以更換Example的兄弟類Example2 , Example3 , Example4……,只要他們繼承ExampleInterface就可以。

3, 最後用最簡單的描述來區分new關鍵字和newInstance()方法的區別:

newInstance: 弱類型。低效率。只能調用無參構造。

new: 強類型。相對高效。能調用任何public構造。

注:Class下的newInstance()的使用有侷限,因為它生成對象只能調用無參的構造函數,而使用new關鍵字生成對象沒有這個限制。

4, Class.forName("")返回的是類

Class.forName("").newInstance()返回的是object

為什麼在我們加載數據庫驅動包的時候有的卻沒有調用newInstance()方法呢?即有的jdbc連接數據庫的寫法裡是Class.forName(xxx.xx.xx);而有一些:Class.forName(xxx.xx.xx).newInstance() 。Class.forName("");的作用是要求JVM查找並加載指定的類,如果在類中有靜態初始化器的話,JVM必然會執行該類的靜態代碼段。而在JDBC規範中明確要求這個Driver類必須向DriverManager註冊自己,即任何一個JDBCDriver的Driver類的代碼都必須類似如下:

public class MyDriver implements Driver {

static {

DriverManager.registerDriver(new MyDriver());

}

}

所以我們在使用JDBC時只需要Class.forName(XXX.XXX);就可以了。

newInstance() 和 new 的區別


分享到:


相關文章: