㈠ java類和對象在hotspot虛擬機中的存在形式是什麼
在 HotSpot 虛擬機中,Java 類和對象的存在形式如下:
1、類的存在形式
Java 類的存在形式包括以下兩個方面:
類文件:Java 類被編譯成位元組碼,保存在以 .class 為後綴的文件中。
類載入器:在運行時,Java 類通過類載入器被載入到 JVM 中。
類載入器將位元組碼讀入內存,將其轉換成 JVM 內部的數據結構,即類的運行時數據結構,包括類的常量池、欄位信息、方法信息等。
2、對象的存在形式
Java 對象的存在形式包括以下兩個方面:
對象實例:Java 對象在內存中的存在形式是對象實例。對象實例包括對象頭和實例數據兩部分。對象頭存儲對象的元數據信息,比如對象的類信息、鎖信息等;實例數據存儲對象的實例變數信息。
堆空間:Java 對象實例被分配在堆空間中。堆空間是 JVM 中最大的一塊內存,用於存放所有對象實例。
當 Java 程序創建對象時,JVM 會在堆空間中為對象實例分配一塊連續的內存,並在對象頭中記錄對象的類信息等元數據。對象的實例變數會被存儲在實例數據中。
㈡ java 類名.class代表什麼意思
在Java編程語言中,"class"關鍵字用於定義類。當一個類被編譯後,編譯器會生成一個以該類名為命名的位元組碼文件。例如,如果你有一個名為"MyClass"的類,編譯器將生成一個名為"MyClass.class"的文件。這個文件包含了類的所有信息,包括欄位、方法以及類的結構。
因此,當提到"類名.class"時,我們實際上是在指代編譯後的位元組碼文件。這些文件可以在Java虛擬機(JVM)中被載入和執行。類名.class是Java類文件的一種引用方式,它幫助JVM識別和載入特定的類。例如,如果你有一個名為"MyClass.class"的文件,你可以通過類名來引用它,例如:MyClass.class。
在Java中,類名與.class文件名之間的關系是緊密相連的。類名是區分大小寫的,並且通常遵循駝峰命名法。比如,一個類名為"MyClass",其編譯後的位元組碼文件名也應為"MyClass.class"。值得注意的是,類名與.class文件名在Java中是完全等價的,二者都可以用來引用同一個類。
使用類名.class的方式在Java中有多種應用場景。例如,在使用反射API時,可以通過類名.class來獲取類的Class對象。Class對象提供了關於類的詳細信息,包括欄位、方法和構造方法等。此外,在一些框架和庫中,類名.class也被用來指定配置文件或資源文件,以便於載入和使用。
㈢ java程序運行的五個步驟
1、Java程序從源文件創建到程序運行要經過兩大步驟:1、源文件由編譯器編譯成位元組碼(ByteCode) 2、位元組碼由java虛擬機解釋運行。因為java程序既要編譯同時也要經過JVM的解釋運行,所以說Java被稱為半解釋語言("semi-interpreted" language)。
第一步(編譯): 創建完源文件之後,程序會先被編譯為.class文件。Java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然後引用,否則直接引用,這個有點像make。如果java編譯器在指定目錄下找不到該類所其依賴的類的.class文件或者.java源文件的話,編譯器話報「cant find symbol」的錯誤。
編譯後的位元組碼文件格式主要分為兩部分:常量池和方法位元組碼。常量池記錄的是代碼出現過的所有token(類名,成員變數名等等)以及符號引用(方法引用,成員變數引用等等);方法位元組碼放的是類中各個方法的位元組碼。
第二步(運行):java類運行的過程大概可分為兩個過程:1、類的載入 2、類的執行。需要說明的是:JVM主要在程序第一次主動使用類的時候,才會去載入該類。也就是說,JVM並不是在一開始就把一個程序就所有的類都載入到內存中,而是到不得不用的時候才把它載入進來,而且只載入一次。
2、下面是程序運行的詳細步驟:
在編譯好java程序得到Main.class文件後,在命令行上敲java Main。系統就會啟動一個jvm進程,jvm進程從classpath路徑中找到一個名為Main.class的二進制文件,將Main的類信息載入到運行時數據區的方法區內,這個過程叫做Main類的載入。
然後JVM找到Main的主函數入口,開始執行main函數。
main函數的第一條命令是Animal animal = new Animal("Puppy");就是讓JVM創建一個Animal對象,但是這時候方法區中沒有Animal類的信息,所以JVM馬上載入Animal類,把Animal類的類型信息放到方法區中。
載入完Animal類之後,Java虛擬機做的第一件事情就是在堆區中為一個新的Animal實例分配內存, 然後調用構造函數初始化Animal實例,這個Animal實例持有著指向方法區的Animal類的類型信息(其中包含有方法表,java動態綁定的底層實現)的引用。
當使用animal.printName()的時候,JVM根據animal引用找到Animal對象,然後根據Animal對象持有的引用定位到方法區中Animal類的類型信息的方法表,獲得printName()函數的位元組碼的地址。
開始運行printName()函數。