new 對象和Class的getInstance()方法的差別?


創建對象時的差別

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() 。

如果后來生活條件提高。換為自己主動門了。定義一個類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、使用接口。而且從配置文件獲取接口的實現類——僅僅須要改動配置文件就可以。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM