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

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

Java程序編譯和運行的過程

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

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://m.ilovecolors.com.cn/xiazai/2732.html

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

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 色视频网站免费 | 亚洲天天做日日做天天看2018 | 午夜爽| 日韩一级黄| 2021国产精品午夜久久 | 国产高清免费的视频 | 综合久久久久久 | 日本亚洲a| 在线视频不卡国产在线视频不卡 | 国产一区二区三区影院 | 一区二区在线看 | 亚洲天堂v | 在线观看亚洲成人 | 高清不卡毛片 | 国产手机在线αⅴ片无码观看 | 欧美一区二区三区不卡免费 | 五月激情综合丁香色婷婷 | 亚洲国产男人本色在线观看的a站 | 在线精品亚洲欧洲第一页 | 老湿影院在线免费观看 | 久久成年人视频 | 国产欧美国产精品第一区 | 思99re久久这里只有精品首页 | 免费成人高清 | 最近中文字幕无吗 | 亚洲伊人成人网 | 国产一区2区3区 | 香蕉视频三级 | 91av国产视频 | 日韩免费播放 | 欧洲妇女成人淫片aaa视频 | 亚洲精品第一国产综合野 | 在线欧美亚洲 | 波多野结衣一区二区 | 在线成人观看 | 男女做羞羞的网站视频 | 亚洲精品国产成人中文 | 黄色免费看视频 | 欧美h片在线 | 一本大道香蕉在线 观看 | 日韩精品一区二区三区中文 |