黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java程序編譯和運行的過程

Java程序編譯和運行的過程

更新時間:2019-08-22 11:09:09 來源:動力節點 瀏覽3533次

Java整個編譯以及運行的過程相當繁瑣,本文通過一個簡單的程序來簡單的說明整個流程。

如下圖,Java程序從源文件創建到程序運行要經過兩大步驟:

  1. 源文件由編譯器編譯成字節碼(ByteCode)
  2. 字節碼由java虛擬機解釋運行。因為java程序既要編譯同時也要經過JVM的解釋運行,所以說Java被稱為半解釋語言( "semi-interpreted" language)。

1566442455805521.png

java程序編譯運行過程

下面通過以下這個java程序,來說明java程序從編譯到最后運行的整個流程。代碼如下:

?//MainApp.java??
public class MainApp {??
? ? public static void main(String[] args) {??
? ? ? ? Animal animal = new Animal("Puppy");??
? ? ? ? animal.printName();??
? ? }??
}?
?
//Animal.java??
public class Animal {??
? ? public String name;??
? ? public Animal(String name) {??
? ? ? ? this.name = name;??
? ? }??
? ? public void printName() {??
? ? ? ? System.out.println("Animal ["+name+"]");??
? ? }??
}??

第一步(編譯): 創建完源文件之后,程序會先被編譯為.class文件。Java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然后引用,否則直接引用,這個有點象make。如果java編譯器在指定目錄下找不到該類所其依賴的類的.class文件或者.java源文件的話,編譯器話報“cant find symbol”的錯誤。

編譯后的字節碼文件格式主要分為兩部分:常量池和方法字節碼。常量池記錄的是代碼出現過的所有token(類名,成員變量名等等)以及符號引用(方法引用,成員變量引用等等);方法字節碼放的是類中各個方法的字節碼。下面是MainApp.class通過反匯編的結果,我們可以清楚看到.class文件的結構:

1566442638873901.png

圖2  MainApp類常量池 

1566442660794885.png

圖3  MainApp類方法字節碼

第二步(運行):java類運行的過程大概可分為兩個過程:

  • 類的加載
  • 類的執行。需要說明的是:JVM主要在程序第一次主動使用類的時候,才會去加載該類。也就是說,JVM并不是在一開始就把一個程序就所有的類都加載到內存中,而是到不得不用的時候才把它加載進來,而且只加載一次。

下面是程序運行的詳細步驟:

  1. 在編譯好java程序得到MainApp.class文件后,在命令行上敲java AppMain。系統就會啟動一個jvm進程,jvm進程從classpath路徑中找到一個名為AppMain.class的二進制文件,將MainApp的類信息加載到運行時數據區的方法區內,這個過程叫做MainApp類的加載。
  2. 然后JVM找到AppMain的主函數入口,開始執行main函數。
  3. main函數的第一條命令是Animal animal = new Animal("Puppy");就是讓JVM創建一個Animal對象,但是這時候方法區中沒有Animal類的信息,所以JVM馬上加載Animal類,把Animal類的類型信息放到方法區中。
  4. 加載完Animal類之后,Java虛擬機做的第一件事情就是在堆區中為一個新的Animal實例分配內存, 然后調用構造函數初始化Animal實例,這個Animal實例持有著指向方法區的Animal類的類型信息(其中包含有方法表,java動態綁定的底層實現)的引用。
  5. 當使用animal.printName()的時候,JVM根據animal引用找到Animal對象,然后根據Animal對象持有的引用定位到方法區中Animal類的類型信息的方法表,獲得printName()函數的字節碼的地址。
  6. 開始運行printName()函數

1566443077743362.png

  圖4 java程序運行過程

特別說明:java類中所有public和protected的實例方法都采用動態綁定機制,所有私有方法、靜態方法、構造器及初始化方法都是采用靜態綁定機制。而使用動態綁定機制的時候會用到方法表,靜態綁定時并不會用到。本文只是講述java程序運行的大概過程,所以并沒有細加區分。本文的所述的流程非常粗糙,想深入了解的學員在線咨詢,有專業老師為你提供免費的學習資料。

以上內容相關免費視頻教程下載:

http://www.ilovecolors.com.cn/xiazai/2732.html

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 国产精品12| 一个人看的免费视频www免费 | 亚洲 欧美 国产 中文 | 午夜刺激爽爽视频免费观看 | 午夜精品福利影院 | 最新在线黄色网址 | 色婷婷影院在线视频免费播放 | 一级片在线观看视频 | 一级美国乱色毛片 | 国产欧美一区二区成人影院 | 成年人在线播放视频 | 日韩淫 | 国产精品视频网址 | 高h激h奶汁双性文1v1 | 成人免费视频观看无遮挡 | 大黄网站免费 | 欧美午夜性春猛交 | 国产日韩欧美在线观看 | 欧美在线视频导航 | 国产在线视频你懂得 | 一级片网址| 亚洲欧美专区精品久久 | 五月婷婷久 | 婷婷婷色 | 日韩视频二区 | 最近中文字幕无免费视频 | 91黄色短视频 | 亚洲色图综合网 | 97天天摸天天碰天天爽 | 欧美性高清video| 欧美日韩第一区 | 卡一卡二卡三精品入口 | 成人网视频在线观看免费 | 国产99视频精品免费视频36 | 国产人成精品综合欧美成人 | 在线免费观看日韩 | 成人免费视频网站www | 91精品国产乱码在线观看 | 国产精品欧美一区二区三区不卡 | 日韩在线视频播放 | 国产亚洲人成网站在线观看 |