創建對象時的差別
1、new 對象包含2步,
1)載入類;
2)而且實例化。
2、Class的對象.getInstance(),只不過實例化。
也就是說。在運行 Class的對象.getInstance() 之前一定要先載入相應的類。
//演示樣例代碼
/**
* new 對象和Class的對象.getInstance()的差別?<p>
* 答:<br>
* 1、new 對象包含2步。<br>
* 1)載入類。<br>
* 2)而且實例化。<p>
*
* 2、Class的對象.getInstance(),只不過實例化。<br>
* 也就是說。在運行 Class的對象.getInstance() 之前一定要先載入相應的類。<br>
* @author gzh
*
*/
public class Main1 {
/**
* @param args
*/
public static void main(String[] args) {
// Word word = new Word();
// ClassLoader classLoader = word.getClass().getClassLoader();
ClassLoader classLoader = Word.class.getClassLoader();
System.out.println(classLoader); //注:Word.class是由sun.misc.Launcher$AppClassLoader@1372a1a載入器載入的
try {
Class<?> c = classLoader.loadClass(args[0]); //1、必需要先載入該類;
Object o1 = c.newInstance(); //2、然后,才干夠使用.newInstance()方法來新建實例對象。
Object o2 = c.newInstance();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
詳細應用上的差別
既然使用newInstance()構造對象的地方通過newkeyword也能夠創建對象。為什么又會使用newInstance()來創建對象呢?
如果定義了一個接口Door,開始的時候是用木門的。定義為一個類WoodenDoor,在程序里就要這樣寫 Door door = new WoodenDoor() 。
如果定義了一個接口Door,開始的時候是用木門的。定義為一個類WoodenDoor,在程序里就要這樣寫 Door door = new WoodenDoor() 。
如果后來生活條件提高。換為自己主動門了。定義一個類AutoDoor,這時程序就要改寫為 Door door = new AutoDoor() 。
盡管僅僅是改個標識符,如果這種語句特別多,修改還是挺大的。於是出現了工廠模式,全部Door的實例都由DoorFactory提供。這時換一種門的時候。僅僅須要把工廠的生產模式改一下,還是要改一點代碼。
而假設使用newInstance(),則能夠在不改變代碼的情況下。換為第二種Door。
詳細方法是把Door的詳細實現類的類名放到配置文件里,通過newInstance()生成實例。這樣,改變第二種Door的時候。僅僅改配置文件就能夠了。演示樣例代碼例如以下:
String className = 從配置文件讀取Door的詳細實現類的類名;
Door door = (Door) Class.forName(className).newInstance();
總結上面的3種情況例如以下。
1、直接new 對象。
2、使用接口。硬編碼接口的實現類——假設要更改接口的實現類的話,則必需要改動源代碼,而且又一次編譯源代碼。
3、使用接口。而且從配置文件獲取接口的實現類——僅僅須要改動配置文件就可以。
