㈠ 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()函數。
㈡ java源程序編譯過後的文件是什麼文件
1.
java文件編譯過後會生成一個class文件,裡面是以二進制方式存放的代碼
2.
機器可以識別class文件中的內容,然後作出相應的操作。
㈢ java源代碼與位元組碼文件類型有哪些
java源文件的格式是text/html類型的,可以直接用記事本打開。編碼可以是utf-8,也可以是其它類型的。後綴為.java
源文件編譯後的位元組碼是以CAFE BABY開頭的二進制文件。需要JVM才能讀懂。後綴為.class
一般來說,一個類對應一個位元組碼文件,內部類編譯後也會生成一個單獨的位元組碼文件。位元組碼文件是以類名來命名(標識)的。
一些相關的位元組碼文件可以按照包結構打包成jar文件。jar文件和zip文件差不多。
java程序一般都會依賴很多的jar文件,比如最基本的rt.jar。
㈣ 1.一個Java源程序編譯後會生成一種擴展名為 的位元組碼文件。
填寫:.class。
解釋:java文件通過jvm虛擬機編譯後會生成二進制碼,顯示的文件格式就是「.class」.
之後通過 「java 文件名」的形式運行即可。
㈤ java文件格式是什麼
Java一般存在兩種文件格式,如下:
1.*.java文件是保存源代碼的文本文件
(*代表類名)
使用
javac
*.java可以編譯該文件
使用
java
*可以運行該類
2.*.class是用於保存
Java類的
二進制編碼以及Class對象,每一個
Java類都有一個解釋該類特徵的
Class對象。*.jar文件
是一種壓縮文件格式
㈥ java中什麼是能夠在計算機CPU上執行的二進制代碼
java中的JVM是能夠在計算機CPU上執行的二進制代碼。
java的執行過程
Java代碼需要經過編譯和解釋兩個步驟,才在能在平台上運行。首先java語言的編譯器,幫java代碼編譯成class的位元組碼,之後通過java虛擬機(JVM)來解釋執行。
java代碼的編譯
java代碼是如何編譯的?
首先編譯的解釋:把用高級程序設計語言書寫的源程序,翻譯成等價的計算機匯編語言或機器語言書寫的目標程序的翻譯程序。編譯的具體過程,可以看看《編譯原理》相關的書籍。
其實java的編譯過程,和通常c/c++還是不同的。
java編譯後的位元組碼文件格式主要分為兩部分:常量池和方法位元組碼。常量池記錄的是代碼出現過的所有token(類名,成員變數名等等)以及符號引用(方法引用,成員變數引用等等);方法位元組碼放的是類中各個方法的位元組碼。
Java編譯器卻不將對變數和方法的引用編譯為數值引用,也不確定程序執行過程中的內存布局,而是將些符號引用信息保留在位元組碼中,由解釋器在運行過程中創立內存布局,然後再通過查表來確定一個方法所在的地址,這樣就有效地保證了java的可移植性和安全性。
c/c++的編譯,當C編譯器編譯生成一個對象的代碼時,該代碼是為在某一特定硬體平台運行而生成的。因此在編譯過程中,編譯程序通過查表將所有對符號的引用轉換為特定的內存偏移量,以保證程序運行。
java虛擬機(JVM)
簡單的可以這樣理解它的功能:就是將java編譯之後的位元組碼,解釋成cpu能夠執行的二進制代碼。
JVM是一個虛構出來的計算機,是通過在實際的計算機上模擬模擬各種計算機功能來實現的。JVM有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。JVM的主要工作是解釋自己的指令集(即位元組碼)並映射到本地的CPU的指令集或OS的系統調用。Java語言是跨平台運行的,其實就是不同的操作系統,使用不同的JVM映射規則,讓其與操作系統無關,完成了跨平台性。JVM對上層的Java源文件是不關心的,它關注的只是由源文件生成的類文件(class file)。類文件的組成包括JVM指令集,符號表以及一些補助信息。
java虛擬機工作的原理,可以自己找一下網上的資料。大家還需要思考的問題,jvm的內存、jvm的垃圾回收(GC)、Android的朋友還要區分(Dalvik 和標准 Java 虛擬機JVM)的區別。
總結:
java代碼編譯之後,可以直接運行在Windows或者其它裝有JVM虛擬機的系統下。而C或C++直接編譯成與機器和操作系統相關的代碼。所以C語言編譯的程序沒有跨平台性,就算沒有使用到操作系統相關的API,在不同的系統下也必須重新編譯才能運行。
㈦ JAVA程序編寫的文件是什麼格式的
JAVA
程序編寫的源文件(源代碼)是以".java"為結尾的,JVM(JAVA虛擬機解析的文件)是以".class"為結尾的,".class"文件就是java的可執行文件,同.exe文件具有同等的效果,.class文件採用的是魔力數字存儲,同時為了在不同的CPU下運行,規定了位元組的保存形式,採用大端位元組順序(BIG_ENDIAN)來保存的。而且".class"文件裡麵包含有編譯器的版本以及兼容性數據!
㈧ JVM_位元組碼文件(ClassFile)詳解
我們知道 javac 命令可以將 .java 文件編譯成 .class 文件,而這個 Class 文件 中包含了 Java虛擬機 指令集、符號表以及若干其他輔助信息;最終將在 Java虛擬機 運行。
本文是以 JVM8 為例的。
每一個 Class文件 都有如下的 ClassFile 文件結構:
先簡單介紹一下 ClassFile 文件結構各部分含義:
描述符是表示欄位或方法類型的字元串。
欄位描述符表示類、實例或局部變數的類型。
從上面文法可以看出,欄位描述符中一共有三個類型:
方法描述符包含 0 個或者多個參數描述符以及一個返回值描述符。
看了描述符,可能大家有點疑惑,泛型信息怎麼表示啊?
常量池的通用格式如下:
目前 JVM8 中一共用 14 種常量類型,分別如下:
我們知道要使用一個欄位或者調用一個方法,就必須知道欄位或者方法所屬類符號引用,和欄位的名字和類型,方法的名字和方法參數類型以及方法返回值類型。
但是我們知道類是能繼承的,那麼子類調用父類的方法或者欄位,這里的所屬類符號引用,到底是子類本身還是父類的呢?
我們知道類,方法,欄位都有不同的訪問標志,在 Class 文件 中使用一個 u2 類型數據項來存儲,也就是最多可以有 16 個不同標志位。
在類,方法,欄位中有相同的標志,也有不同的標志,總體規劃,我們可以藉助 Modifier 類的源碼來了解:
在 Modifier 類中,類的訪問標志:
我們知道在 java 中類可以用的修飾符有: public , protected , private , abstract , static , final , strictfp 。
但是我們再看 Class 文件 中類的訪問標志:
仔細看,你會發現有些不同點:
在 Modifier 類中,欄位的訪問標志:
我們知道在 java 中欄位可以用的修飾符有: public , protected , private , static , final , transient 和 volatile 。
但是我們再看 Class 文件 中欄位的訪問標志:
Class 文件 中欄位的訪問標志和 java 中欄位的修飾符差不多,只是多了 ACC_SYNTHETIC 和 ACC_ENUM 兩個標志。
在 Modifier 類中,方法的訪問標志:
我們知道在 java 中方法可以用的修飾符有:
public , protected , private , abstract , static , final , synchronized , synchronized 和 strictfp 。
但是我們再看 Class 文件 中方法的訪問標志:
欄位詳情 field_info 的格式如下:
方法詳情 method_info 的格式如下:
關於 Class 文件 中屬性相關信息,我們再後面章節介紹。
我們可以通過 javap 的命令來閱讀 Class 文件 中相關信息。
這個是最簡單的一個類,沒有任何欄位和方法,只繼承 Object 類,我們來看看它編譯後的位元組碼信息,通過 javap -p -v T.class 的命令:
我們重點關注常量池相關信息,會發現雖然 T.class 很乾凈,但是也有 15 個常量,來我們依次分析:
與之前的例子相比較,多了一個欄位和方法,那麼得到的位元組碼信息如下:
但是你會發現常量池中怎麼沒有這個欄位 name 的 CONSTANT_Fieldref_info 類型的常量呢?
那是因為我們沒有使用這個欄位。
多寫了一個方法 test1 來調用 name 欄位和 test 方法,那麼得到的位元組碼信息如下:
這里定義一個父類 TParent ,有一個公共欄位 name 和方法 say 。子類
㈨ java是什麼文件格式
java就是.java類型的文件,編譯後就是.class文件