1、每個類都有一個class對象,每當編寫并且編譯了一個 新類,就會產生一個class對象,更恰當的說,是被保存在一個同名的.class文件中,為了生成這個類對象,運行這個程序的java虛擬機jvm將使用被稱為類加載器的子系統。所有類都是在對其第一次使用時,動態加載到jvm中的,當程序創建第一個對類的靜態成員的引用時,就會加載這個類。
2、類的構造器也是靜態方法,即使在構造器前面并沒有使用static關鍵字,因此,用new關鍵字調用構造方法時也會加載這個類
3、類加載器首先檢查這個Class對象是否已經加載,如果尚未加載,默認的類加載器就會根據類名查找.class 文件,在這個類的字節碼被加載時,它們會接受驗證,以確保沒有被破壞,并且不包含不良java代碼
4、Class的forName方法時取得Class對象的引用的一種方法,對forName的調用時為了它產生的副作用,如果某個類還沒有被加載就加載它,在加載的過程中,static字句被執行
5、Class類的getName方法:獲取類的全名(包含包名),getSimpleName方法:獲取簡稱(不包含包名,只是類名),isInterface方法:判斷類是否是interface,getInterfaces方法:獲取類的所有接口
6、用Class.forName.newInstance的方式來創建一個Class的對象時,Class必須帶有一個默認的構造器,否則無法知道應該調用哪一個構造器來初始化Class對象
7、java還提供了另一種方式來生成對class對象的引用,即:類字面常量 FacyToy.class 。類字面常量不僅可以應用于普通類,也可以用于接口,數組以及基本數據類型。另外,對于基本數據類型的包裝類,還有一個標準字段TYPE。boolean.class 等價于Boolean.TYPE。當使用.class來創建對Class對象的引用時,不會自動的初始化該Class對象。
8、為了使用類而做的準備工作有如下三步:
1)、加載:這是由類加載器執行的,該步驟查找字節碼(從class文件中),并從字節碼中創建一個Class對象
2)、鏈接:在鏈接階段將驗證字節碼,為靜態域分配存儲空間,并且如果必須的話,將解析這個類創建的對其他類的所有引用
3)、初始化:如果該類具有超類,則對其初始化,執行靜態初始化器和靜態初始化快。初始化被延遲到了對靜態方法(構造器隱式的是靜態的)或者非常數靜態域進行首次引用時才執行
示例程序:
class Initable { static final int staticFinal = 47; static final int staticFinal2 = ClassInitialization.rand.nextInt(1000); static { System.out.PRintln("Initializing Initable"); }}class Initable2 { static int staticNonFinal = 147; static { System.out.println("Initializing Initable2"); }}class Initable3 { static int staticNonFinal = 74; static { System.out.println("Initializing Initable3"); }}public class ClassInitialization { public static Random rand = new Random(47); public static void main(String[] args) throws Exception { Class initable = Initable.class; System.out.println("After creating Initable ref"); // Does not trigger initialization: System.out.println(Initable.staticFinal); // Does trigger initialization: System.out.println(Initable.staticFinal2); // Does trigger initialization: System.out.println(Initable2.staticNonFinal); Class initable3 = Class.forName("Initable3"); System.out.println("After creating Initable3 ref"); System.out.println(Initable3.staticNonFinal); }} /* Output:After creating Initable ref47Initializing Initable258Initializing Initable2147Initializing Initable3After creating Initable3 ref74
該程序的解釋詳見p353頁
新聞熱點
疑難解答