java創建對象實例的方法及區別

本博客總結了前人的研究,添加了自己的理解

一.創建對象實例的方法
1、類.class.newInstance();
2、Class.forName(類全限定名).newInstance();
3、new 類();

從JVM的角度看,我們使用關鍵字new創建一個類的時候,這個類可以沒有被加載。但是使用newInstance()方法的時候,就必須保證:
1、這個類已經加載;
2、這個類已經連接了。
而完成上面兩個步驟的正是Class的靜態方法forName()所完成的,這個靜態方法調用了類加載器,即加載 java API的那個加載器。

現在可以看出,newInstance()實際上是把new這個方式分解爲兩步,即首先調用Class加載方法加載某個類,然後實例化。

這樣分步的好處是顯而易見的。我們可以在調用class的靜態加載方法forName時獲得更好的靈活性,提供給了一種降耦的手段。

 

二.new 、Class.forName(1)和newInstanc()有什麼區別?
其實上面已經說到一些了,這裏來做個總結:
首先,newInstance( )是一個方法,而new是一個關鍵字;
其次,Class下的newInstance()的使用有侷限,因爲它生成對象只能調用無參的構造函數,而使用 new關鍵字生成對象沒有這個限制。

注意,Class.forName()的作用是要求JVM查找並加載指定的類,如果在類中有靜態初始化器的話,JVM必然會執行該類的靜態代碼段。
簡言之:
newInstance(): 弱類型,低效率,只能調用無參構造。
new: 強類型,相對高效,能調用任何public構造。
Class.forName(“”)返回的是類。
Class.forName(“”).newInstance()返回的是object 。


三.爲什麼在加載數據庫驅動包的時候用的是Class.forName( ),卻沒有調用newInstance( )?
在Java開發特別是數據庫開發中,經常會用到Class.forName( )這個方法。
Class.forName( )靜態方法的目的是爲了動態加載類。
通常編碼過程中,在加載完成後,一般還要調用Class下的newInstance( )靜態方法來實例化對象以便操作。因此,單使用Class.forName( )是動態加載類,是沒有用的,其最終目的是爲了實例化對象。

而在JDBC規範中明確要求這個Driver類必須向DriverManager註冊自己,即任何一個JDBC Driver的 Driver類的代碼都必須類似如下:

  public class MyJDBCDriver implements Driver {

  static {

              DriverManager.registerDriver(new MyJDBCDriver());

             }

  }

 既然在靜態初始化器的中已經進行了註冊,所以我們在使用JDBC時只需要Class.forName(XXX.XXX);就可以了。

 

附帶:加載jdbc驅動的方式:
1.Class.forName(“com.mysql.jdbc.Driver”);

2.DriverManager.registerDriver(new com.mysql.jdbc.Driver())

3.System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”);
 

優劣比較:
第二種與第三種註冊的方法看起來更加的直接與好理解。

但是,第一種與第三種方法可以脫離jdbc的驅動進行編譯,第二種方法不可以的,它一定要有jdbc的驅動纔可以通過編譯,這樣對我們的程序就有很多的不好之處,爲程序換數據庫會帶來麻煩,並且,Driver類中就有一個靜態的代碼塊,只要我們執行了Driver類中的靜態代碼塊,並把驅動的實例放入到Drivers的一個數組列表中,我們再調用方法registerDrever就相當於又向drivers列表中放了一次driver驅動,意思是加載了兩次驅動,雖然這並不影響我們程序,但是這樣做實在是沒有必要,還會影響程序的運行。

第三種雖然也可以脫離,但是方法參數設置相對來說較爲複雜,它可以設置多個驅動,所以在加載單個驅動時,一般採用第一種方法。

第一種方法是通過Class把類先裝載到java的虛擬機中,並沒有創建Driver類的實例。好處在於能夠在編譯時不依賴於特定的JDBC Driver庫,也就是減少了項目代碼的依賴性,而且也很容易改造成從配置文件讀取JDBC配置,從而可以在運行時動態更換數據庫連接驅動。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章