我們已經討論過類是複雜數據類型這一事實。現在讓我們談談類的另一面——Java 機器是如何處理類的。請記住,在 Java 中,一切都是對象,甚至是類。一個類就是一個對象。這讓你感到驚訝嗎?那我們繼續吧。
加載類到內存
實際上,當一個類被加載到內存中時,會創建三個特殊的“對象”:
插圖簡要說明:
黃色矩形:
代碼文件作為擴展名為“.class”的文件存儲在磁盤上。它包含有關類、類的字段和方法的信息,以及編譯成字節碼的方法的源代碼。
橙色矩形:
當 Java 機器將一個類加載到內存中時,它會將字節碼編譯成特定於計算機處理器和操作系統的機器碼。只有 Java 機器可以訪問此機器代碼。作為 Java 程序員,我們無權訪問它。
綠色矩形:
Java 機器創建一個包含類的所有靜態變量和方法的對象。您使用類名訪問此“對象”。
例如,當您編寫 時,您指的是位於類中的靜態變量。這個對像是我們的綠色矩形。這就是存儲靜態變量的地方。java.lang.Math.PI
PI
java.lang.Math
java.lang.Math
PI
藍色矩形:
當 Java 機器將一個類的代碼加載到內存中時,它會創建一個特殊的java.lang.Class
對象,該對象存儲有關加載的類的信息:它的名稱、方法名稱、字段名稱和類型等。
“Class”這個名字可能有點令人困惑。將其稱為 ClassInfo 更有意義,因為此類僅存儲有關加載類的一些信息。
您可以使用如下命令獲取任何類型的 Class 對象:
Class name = ClassName.class;
例子:
代碼 | 筆記 |
---|---|
|
獲取Class 包含String 類信息的對象 |
|
獲取Class 包含Object 類信息的對象 |
|
獲取Class 包含Integer 類信息的對象 |
|
獲取Class 包含有關int 類型信息的對象 |
|
獲取Class 包含有關void 類型信息的對象 |
您還可以從任何對象獲取對類描述對象的引用,因為每個對像都有getClass()
從Object
類繼承的方法。
例子:
代碼 | 筆記 |
---|---|
|
與相同的對象String.class |
|
與相同的對象Integer.class |
|
與相同的對象Boolean.class |
GO TO FULL VERSION