我們已經討論過類是複雜數據類型這一事實。現在讓我們談談類的另一面——Java 機器是如何處理類的。請記住,在 Java 中,一切都是對象,甚至是類。一個類就是一個對象。這讓你感到驚訝嗎?那我們繼續吧。

加載類到內存

實際上,當一個類被加載到內存中時,會創建三個特殊的“對象”:

加載類到內存

插圖簡要說明:

黃色矩形:

代碼文件作為擴展名為“.class”的文件存儲在磁盤上。它包含有關類、類的字段和方法的信息,以及編譯成字節碼的方法的源代碼。

橙色矩形:

當 Java 機器將一個類加載到內存中時,它會將字節碼編譯成特定於計算機處理器和操作系統的機器碼。只有 Java 機器可以訪問此機器代碼。作為 Java 程序員,我們無權訪問它。

綠色矩形:

Java 機器創建一個包含類的所有靜態變量和方法的對象。您使用類名訪問此“對象”。

例如,當您編寫 時,您指的是位於類中的靜態變量。這個對像是我們的綠色矩形。這就是存儲靜態變量的地方。java.lang.Math.PIPIjava.lang.Mathjava.lang.MathPI

藍色矩形:

當 Java 機器將一個類的代碼加載到內存中時,它會創建一個特殊的java.lang.Class對象,該對象存儲有關加載的類的信息:它的名稱、方法名稱、字段名稱和類型等。

“Class”這個名字可能有點令人困惑。將其稱為 ClassInfo 更有意義,因為此類僅存儲有關加載類的一些信息。

您可以使用如下命令獲取任何類型的 Class 對象:

Class name = ClassName.class;

例子:

代碼 筆記
Class a = String.class;
獲取Class包含String類信息的對象
Class b = Object.class;
獲取Class包含Object類信息的對象
Class c = Integer.class;
獲取Class包含Integer類信息的對象
Class d = int.class;
獲取Class包含有關int類型信息的對象
Class e = void.class;
獲取Class包含有關void類型信息的對象

您還可以從任何對象獲取對類描述對象的引用,因為每個對像都有getClass()Object類繼承的方法。

例子:

代碼 筆記
Class a = "Hello".getClass();
與相同的對象String.class
Class b = new Integer().getClass();
與相同的對象Integer.class
Class c = Boolean.TRUE.getClass();
與相同的對象Boolean.class