1、java編譯生成的字節(jié)碼,在所有操作系統(tǒng)都是一樣,故其有這樣的特點:
創(chuàng)新互聯(lián)公司于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目成都網(wǎng)站設計、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元烏蘭做網(wǎng)站,已為上家服務,為烏蘭各地企業(yè)和個人服務,聯(lián)系電話:13518219792
write once, run anywhere.其意思:只需要一次編碼,就可以在任何環(huán)境下運行。
2、不同的操作系統(tǒng),其java 虛擬機是不一樣的。虛擬機將java字節(jié)代碼轉(zhuǎn)換對應操作系統(tǒng)的
相關指令,保證其正常運行。
3、java 系統(tǒng)支持所有的硬件的平臺,不存在你提及的問題,你可以放心使用。
4、解釋器在java虛擬機中,編譯器在JDK或JRE 中。
5、java虛擬機就是常說的java 運行環(huán)境,其縮寫是 JRE,安裝在操作系統(tǒng)下的一個目錄中,
這個目錄在安裝時可以由你自行指定,就像你安裝其它應用軟件一樣。JDK中包含了JRE,
還有開發(fā)環(huán)境,如編譯器,幫助文檔生成器,以及系統(tǒng)API的jar庫文件等。
最基本的操作是:
1.首先在一個java文件中設斷點,然后debug as--open debug Dialog,然后在對話框中選類后-- Run
當程序走到斷點處就會轉(zhuǎn)到debug視圖下。
2.F5鍵與F6鍵均為單步調(diào)試,F(xiàn)5是step into,也就是進入本行代碼中執(zhí)行,F(xiàn)6是step over,
也就是執(zhí)行本行代碼,跳到下一行,
3.F7是跳出函數(shù)
4.F8是執(zhí)行到最后。
1.Step Into (also F5) 跳入
2.Step Over (also F6) 跳過
3.Step Return (also F7) 執(zhí)行完當前method,然后return跳出此method
4.step Filter 逐步過濾 一直執(zhí)行直到遇到未經(jīng)過濾的位置或斷點(設置Filter:window-preferences-java-Debug-step Filtering)
5.resume 重新開始執(zhí)行debug,一直運行直到遇到breakpoint
6.hit count 設置執(zhí)行次數(shù) 適合程序中的for循環(huán)(設置 breakpoint view-右鍵hit count)
7.inspect 檢查 運算。執(zhí)行一個表達式顯示執(zhí)行值
8.watch 實時地監(jiān)視變量的變化
9.我們常說的斷點(breakpoints)是指line breakpoints,除了line breakpoints,還有其他的斷點類型:field(watchpoint)breakpoint,method breakpoint,exception breakpoint.
10.field breakpoint 也叫watchpoint(監(jiān)視點) 當成員變量被讀取或修改時暫掛
11.添加method breakpoint 進入/離開此方法時暫掛(Run-method breakpoint)
12.添加Exception breakpoint 捕抓到Execption時暫掛(待續(xù)...)
斷點屬性:
1.hit count 執(zhí)行多少次數(shù)后暫掛 用于循環(huán)
2.enable condition 遇到符合你輸入條件(為ture\改變時)就暫掛
3.suspend thread 多線程時暫掛此線程
4.suspend VM 暫掛虛擬機
13.variables 視圖里的變量可以改變變量值,在variables 視圖選擇變量點擊右鍵--change value.一次來進行快速調(diào)試。
14.debug 過程中修改了某些code后--〉savebuild--resume--重新暫掛于斷點
Java程序從源文件創(chuàng)建到程序運行要經(jīng)過兩大步驟:1、源文件由編譯器編譯成字節(jié)碼(ByteCode)
2、字節(jié)碼由java虛擬機解釋運行。因為java程序既要編譯同時也要經(jīng)過JVM的解釋運行,所以說Java被稱為半解釋語言( "semi-interpreted" language)。
下面通過以下這個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+"]");
}
}
第一步(編譯): 創(chuàng)建完源文件之后,程序會先被編譯為.class文件。Java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然后引用,否則直接引用,這個有點象make。如果java編譯器在指定目錄下找不到該類所其依賴的類的.class文件或者.java源文件的話,編譯器話報“cant find symbol”的錯誤。
編譯后的字節(jié)碼文件格式主要分為兩部分:常量池和方法字節(jié)碼。常量池記錄的是代碼出現(xiàn)過的所有token(類名,成員變量名等等)以及符號引用(方法引用,成員變量引用等等);方法字節(jié)碼放的是類中各個方法的字節(jié)碼。下面是MainApp.class通過反匯編的結(jié)果,我們可以清楚看到.class文件的結(jié)構(gòu):
第二步(運行):java類運行的過程大概可分為兩個過程:1、類的加載 2、類的執(zhí)行。需要說明的是:JVM主要在程序第一次主動使用類的時候,才會去加載該類。也就是說,JVM并不是在一開始就把一個程序就所有的類都加載到內(nèi)存中,而是到不得不用的時候才把它加載進來,而且只加載一次。
下面是程序運行的詳細步驟:
在編譯好java程序得到MainApp.class文件后,在命令行上敲java AppMain。系統(tǒng)就會啟動一個jvm進程,jvm進程從classpath路徑中找到一個名為AppMain.class的二進制文件,將MainApp的類信息加載到運行時數(shù)據(jù)區(qū)的方法區(qū)內(nèi),這個過程叫做MainApp類的加載。
然后JVM找到AppMain的主函數(shù)入口,開始執(zhí)行main函數(shù)。
main函數(shù)的第一條命令是Animal animal = new Animal("Puppy");就是讓JVM創(chuàng)建一個Animal對象,但是這時候方法區(qū)中沒有Animal類的信息,所以JVM馬上加載Animal類,把Animal類的類型信息放到方法區(qū)中。
加載完Animal類之后,Java虛擬機做的第一件事情就是在堆區(qū)中為一個新的Animal實例分配內(nèi)存, 然后調(diào)用構(gòu)造函數(shù)初始化Animal實例,這個Animal實例持有著指向方法區(qū)的Animal類的類型信息(其中包含有方法表,java動態(tài)綁定的底層實現(xiàn))的引用。
當使用animal.printName()的時候,JVM根據(jù)animal引用找到Animal對象,然后根據(jù)Animal對象持有的引用定位到方法區(qū)中Animal類的類型信息的方法表,獲得printName()函數(shù)的字節(jié)碼的地址。
開始運行printName()函數(shù)。
特別說明:java類中所有public和protected的實例方法都采用動態(tài)綁定機制,所有私有方法、靜態(tài)方法、構(gòu)造器及初始化方法都是采用靜態(tài)綁定機制。而使用動態(tài)綁定機制的時候會用到方法表,靜態(tài)綁定時并不會用到。