newInstance和new的區別

    使用JDBC時候,常見的語句以下: java


Class.forName("com.mysql.jdbc.Driver");   
String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";   
String user = "";   
String psw = "";   
Connection con = DriverManager.getConnection(url,user,psw);

其中第一句是爲了加載數據庫驅動,它也能夠寫成: mysql

com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();   
//or:   
//new com.mysql.jdbc.Driver();
爲了保證相應的Driver類已經被加載到 jvm中,而且完成了類的初始化工做就好了,而具體是怎樣實現這個功能倒是沒有講究的。

裝載的代碼以下: sql

package com.mysql.jdbc   
  
public class Driver extends NonRegisteringDriver implements java.sql.Driver {   
// ~ Static fields/initializers   
// --------------------------------------------- //   
// Register ourselves with the DriverManager   
//   
static {   
     t ry {   
               java.sql.DriverManager.registerDriver(new Driver());   
           } catch (SQLException E) {   
              throw new RuntimeException("Can't register driver!");   
           }   
   }   
// ~ Constructors   
// -----------------------------------------------------------   
/**
   * Construct a new driver and register it with DriverManager
   *
   * @throws SQLException
   *              if a database error occurs.
   */  
public Driver() throws SQLException {   
     // Required for Class.forName().newInstance()   
}   
}
在初始化一個類,生成一個實例的時候, newInstance()方法和new關鍵 除了一個是方法,一個是關鍵字外,

最主要區別在於 數據庫

建立對象的方式不同,前者是使用類加載機制,後者是建立一個新類。 jvm


那麼爲何會有兩種建立對象方式?這主要考慮到軟件的可伸縮、可擴展和可重用等軟件設計思想。 

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就能夠。 


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


如今能夠看出,newInstance()其實是把new這個方式分解爲兩步,即首先調用Class加載方法加載某個類,而後實例化。 這樣分步的好處是顯而易見的。咱們能夠在調用class的靜態加載方法forName時得到更好的靈活性,提供給了一種降耦的手段。 


最後用最簡單的描述來區分new關鍵字和newInstance()方法的區別: 
newInstance: 弱類型。低效率。只能調用無參構造。 
new: 強類型。相對高效。能調用任何public構造
ui

以上文字主要摘自http://blog.csdn.net/hepenghit/article/details/5286398 url

在此主要對newInstance和new的區別作個記錄 spa

相關文章
相關標籤/搜索