創建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");
}
}