java代碼:? |
public interface Assembly{ ? ? publicvoid start(); } publicclass Word implements Assembly{ ? ? static{ ? ? ? ? System.out.println("Word static initialization!"); ? ? }? ? ? ? public? void start(){ ? ? ? ? System.out.prinlnt("Word starts"); ? ? } } publicclass Office{ ? ? publicstaticvoid main(String args[])throwsException{ ? ? ? ? Office off = new Office(); ? ? ? ? System.out.println("類別準備載入"); ? ? ? ? Class c = Class.forName(arg[0],true,Office.class.getClassLoader()); ? ? ? ? System.out.println("類別準備實例化"); ? ? ? ? Object o = c.newInstance(); ? ? ? ? Object o2= c.newInstance(); ? ?} } 當forName方法中的第二參數是true時,顯示的是: 類別準備載入 Word static initialization! 類別準備實例化 當forName方法中的第二參數是false時,顯示的是: 類別準備載入 類別準備實例化 Word static initialization! 當true的時候是主動使用,當fasle的時候是被動使用. 在P162說:java虛擬機在首次使用類型時初始化它們。只有6種活動被認為是主動使用:創建類的新實例,調用類中聲明的靜態方法,操作類或者接口中聲明的非常量靜態字段,調用Java API中特定的反射方法,初始化一個類的子類,以及指定一個類作為Java虛擬機啟動時的初始化類。 把 Class c = Class.forName(arg[0],true,Office.class.getClassLoader()); 中的 Office,改成Word,不管forName的第二參數是否是fasle與true,都是 類別準備載入 Word static initialization! 類別準備實例化 |