靜態加載與動態加載

創建Office,使用javac命令進行編譯,會報錯Word和Office找不到符號,如果我們創建了Word類,對Word使用javac進行編譯,然後對Office進行編譯,發現只報Excel找不到的錯誤。假設我們只想用Word的功能,程序沒法使用。用不了的原因是,因爲程序是做類的靜態加載,在編譯時刻就需要加載所有的可能使用到的類。在實際應用中,我們希望word存在,word就能用,用excel的時候才報錯。這就是編譯時刻加載導致的,new都是編譯時刻加載。

class Office{
	public static void main(String[] args){
		//new 創建對象 是靜態加載類,在編譯時刻就需要加載所有的可能使用到的類。
		if("Word".equals(args[0])){
			Word word = new Word();
			word.start();
		}
		if("Excel".equals(args[0])){
			Excel excel = new Excel();
			excel.start();
		}
	}
}

通過動態加載可以解決該問題,在編譯的時候,不會報錯,只有在運行的時候纔有可能報錯。創建OfficeAble標準,Word和Office都實現這個接口,防止出現類型轉換錯誤。現在使用java OfficeBetter Word,可以運行Word的方法,如果想運行Excel,只需要實現Excel這個類就行了,然後,OfficeBetter這個類不需要重新編譯,直接運行即可。以後添加其他Office的實現,OfficeBetter這個類都不需要修改,只需要動態的加新的功能就可以了。功能性的類一般都使用動態加載,而不是靜態加載。

class OfficeBetter{
	public static void main(String[] args){
		try{
			//動態加載類,在運行時刻,編譯時不會報錯
			Class c = Class.forName(args[0]);
			//通過類類型創建對象,創建該類對象
			OfficeAble oa =(OfficeAble) c.newInstance();
			oa.start();
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}


interface OfficeAble{	
	public void start();
}

class Word implements OfficeAble{
	public void start(){
		System.out.println("Word start");
	}
}




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