1. 程式人生 > >為什麼jdbc 只是需要class.forName(); 就可以了不需要newInstance();方法

為什麼jdbc 只是需要class.forName(); 就可以了不需要newInstance();方法

其實上面已經說到一些了,這裡來做個總結:
首先,newInstance( )是一個方法,而new是一個關鍵字;
其次,Class下的newInstance()的使用有侷限,因為它生成物件只能呼叫無參的建構函式,而使用 new關鍵字生成物件沒有這個限制。
簡言之:
newInstance(): 弱型別,低效率,只能呼叫無參構造。
new: 強型別,相對高效,能呼叫任何public構造。
Class.forName(“”)返回的是類。
Class.forName(“”).newInstance()返回的是object 。
三.為什麼在載入資料庫驅動包的時候有用的是Class.forName( ),卻沒有呼叫newInstance( )?
在Java開發特別是資料庫開發中,經常會用到Class.forName( )這個方法。
通過查詢Java Documentation我們會發現使用Class.forName( )靜態方法的目的是為了動態載入類。
通常編碼過程中,在載入完成後,一般還要呼叫Class下的newInstance( )靜態方法來例項化物件以便操作。因此,單單使用Class.forName( )是動態載入類是沒有用的,其最終目的是為了例項化物件。

有資料庫開發經驗朋友會發現,為什麼在我們載入資料庫驅動包的時候有的卻沒有呼叫newInstance( )方法呢?
即有的jdbc連線資料庫的寫法裡是Class.forName(xxx.xx.xx);而有一 些:Class.forName(xxx.xx.xx).newInstance(),為什麼會有這兩種寫法呢?
剛 才提到,Class.forName(“”);的作用是要求JVM查詢並載入指定的類,首先要明白,java裡面任何class都要裝載在虛擬機器上才能運 行,而靜態程式碼是和class繫結的,class裝載成功就表示執行了你的靜態程式碼了,而且以後不會再走這段靜態程式碼了。
而我們前面也說了,Class.forName(xxx.xx.xx)的作用就是要求JVM查詢並載入指定的類,如果在類中有靜態初始化器的話,JVM必然會執行該類的靜態程式碼段。
而在JDBC規範中明確要求這個Driver類必須向DriverManager註冊自己,即任何一個JDBC Driver的 Driver類的程式碼都必須類似如下:
public class MyJDBCDriver implements Driver {
static {
DriverManager.registerDriver(new MyJDBCDriver());
}
}
既然在靜態初始化器的中已經進行了註冊,所以我們在使用JDBC時只需要Class.forName(XXX.XXX);就可以了。

相關英文參考文獻如下:
we just want to load the driver to jvm only, but not need to user the instance of driver,
so call Class.forName(xxx.xx.xx) is enough, if you call Class.forName(xxx.xx.xx).newInstance(),
the result will same as calling Class.forName(xxx.xx.xx),
because Class.forName(xxx.xx.xx).newInstance() will load driver first,
and then create instance, but the instacne you will never use in usual,
so you need not to create it.