Java基本概念
JDK包含了不少Java開發(fā)相關(guān)命令。如,javac、java、javap、javaw、javadoc。雖然現(xiàn)在的Java開發(fā)都使用IDE完成,基本上不會(huì)直接使用這些命令。但是理解這些命令的用法,可以讓我們更加扎實(shí)的掌握java編譯、運(yùn)行等的基本概念。
在講解Java命令之前,我們先了解一些基本概念,可以幫助我們更加深刻的所要講解的Java命令。
一、JRE(Java運(yùn)行時(shí)環(huán)境)
Java Runtime Environment。故名思意,包含了運(yùn)行Java程序所需的環(huán)境,比如Java虛擬機(jī)、相關(guān)的類庫(kù)等相關(guān)資源。**你可以將JRE理解成一個(gè)運(yùn)行在操作系統(tǒng)上的程序,該程序可以用來運(yùn)行Java程序。**這個(gè)程序只用來運(yùn)行運(yùn)行Java程序,但并不包含Java開發(fā)的工具。因此,對(duì)于開發(fā)人員,只有JRE是不夠。對(duì)于需要運(yùn)行的Java程序的普通用戶,只需要正確版本的JRE就可以運(yùn)行Java程序了。
注意:每個(gè)操作系統(tǒng)上的JRE程序都是不一樣的,比如Windows與Linux上的JRE就不一樣。你可以將不一樣,理解成他們的代碼不同。因此你在下載時(shí),會(huì)發(fā)現(xiàn)不同操作操作系統(tǒng)會(huì)有不同的JRE,即使是同一個(gè)操作系統(tǒng),32位與64位的JRE也不一樣。
二、JDK(Java開發(fā)工具)
Java Development Kit。包含了Java開發(fā)的工具,比如javac、javap命令、java源代碼等。對(duì)于開發(fā)人員,需要下載這個(gè)才能開發(fā)Java程序。
JDK 8及之前,安裝JDK的時(shí)候除了安裝JDK還會(huì)安裝一個(gè)獨(dú)立的JRE,因此你在安裝的時(shí)候,會(huì)發(fā)現(xiàn)要安裝兩個(gè)東西。這個(gè)JRE,可以運(yùn)行兼容版本的Java程序。換句話說,對(duì)于所有Java程序,某個(gè)JRE是完全一樣的,不能單獨(dú)定制。注意:安裝JDK 8實(shí)際上安裝了兩個(gè)JRE。一個(gè)安裝在JDK目錄的jre目錄中,另一個(gè)安裝在你指定的其他目錄。
JDK 11及之后,不包含另一個(gè)獨(dú)立的JRE。JDK本身已經(jīng)包含了Java的運(yùn)行時(shí)環(huán)境,不過這個(gè)運(yùn)行時(shí)環(huán)境剝離了一些東西,比如默認(rèn)不包含的Java Swing。Java 11使用了jigsaw模塊化系統(tǒng),你可以為java程序創(chuàng)建一個(gè)更小的適合該程序的JRE。比如,你的Java程序不包含Java Swing代碼,你可以使用jlink為你的程序定制一個(gè)更小的專屬于你的程序的JRE。
結(jié)論:
1.JDK 11后,你不需要安裝獨(dú)立的JRE,因?yàn)槠湟呀?jīng)包含了。
2.JDK 11引入了模塊化系統(tǒng),你可以為自己的程序定制JRE。
三、Java源代碼文件(.class)
.java文件(后綴名為java,如Hello.java),包含Java源代碼。本質(zhì)上是一個(gè)文本文件,可通過文本編輯器編輯,不能直接運(yùn)行。
四、Java字節(jié)碼文件(.java)
.class文件(如Hello.class),.java文件經(jīng)過javac命令編譯得到.class文件。是一個(gè)二進(jìn)制文件,包含了Java虛擬機(jī)才看得懂的字節(jié)碼命令。
五、Java虛擬機(jī)(JVM)
Java Virtual Machine,簡(jiǎn)稱JVM。通常來說JRE都要包含JVM。JVM是字節(jié)碼文件運(yùn)行的環(huán)境,可以加載與運(yùn)行Java類。你的.class實(shí)際上是跑在JVM上,而JVM則是一個(gè)獨(dú)立的程序,運(yùn)行在操作系統(tǒng)上。每個(gè)操作系統(tǒng)上JVM的程序都不一樣。但他們有一個(gè)共同之處,就是都可以運(yùn)行你的.class文件。
六、跨平臺(tái)運(yùn)行
什么是跨平臺(tái)運(yùn)行呢?
就是你編寫好的.java源代碼編譯為.class字節(jié)碼文件后,那么任何兼容該.class文件的JRE中的JVM都可以運(yùn)行該字節(jié)碼文件。而無需考慮這個(gè)JRE到底是Linux下的,還是Windows下。簡(jiǎn)單地說,你在Windows下編譯好的.class文件,拿到Linux下,只要JRE版本正確,就可以運(yùn)行。注意:這里的兼容指的是,Java版本的向下兼容。比如,你在Java 8下編譯的字節(jié)碼文件,理論上來說Java 11是可以直接運(yùn)行的。反之則不行。
相比較于C或C++語(yǔ)言,你在Windows下使用gcc工具編譯、鏈接成可執(zhí)行程序.exe。這個(gè)可執(zhí)行程序,在Linux下是無法執(zhí)行的。
為什么可以跨平臺(tái)呢?
關(guān)鍵在于JVM。.class字節(jié)碼文件是結(jié)構(gòu)中立的。所謂的結(jié)構(gòu)中立指的是.class文件包含的面向JVM的字節(jié)碼命令,而不是面對(duì)某個(gè)操作系統(tǒng)的機(jī)器碼。你在哪個(gè)操作系統(tǒng)上對(duì)某個(gè).java文件進(jìn)行編譯生成的.class文件都是一樣的(只要Java版本相同)。因此,不管你是Linux上的JVM還是Windows上的JVM,都可以運(yùn)行這些.class文件中字節(jié)碼指令。見下圖。
注意:字節(jié)碼不是機(jī)器碼,因此不能直接在操作系統(tǒng)上直接運(yùn)行。只能先運(yùn)行JVM,才能運(yùn)行字節(jié)碼文件。這也就是早期Java程序慢的一個(gè)原因。
七、JDK與JRE、JVM的關(guān)系?
JDK包含了JRE與Java開發(fā)工具(如javac,java,jar, jlink等命令)。
JRE包含了JVM、Java類庫(kù)與一些資源文件。
八、幾個(gè)結(jié)論
1.Java程序的開發(fā)運(yùn)行流程
編寫.java文件—經(jīng)過javac編譯—>.class文件—使用java命令載入—>載入到JVM運(yùn)行。
如下圖所示。
2.運(yùn)行JAVA程序必須先運(yùn)行JRE中的JVM。
3.Java程序是跨平臺(tái)的。編譯好的.class文件可以在不同操作系統(tǒng)上兼容的Java上運(yùn)行。
4.Java 11及以后支持模塊化系統(tǒng)jigsaw。因此可為自己的Java程序定制化JRE。不過初學(xué)者,暫時(shí)不用考慮這些,直接使用默認(rèn)的JRE即可。但碰到問題時(shí)(如要編寫Java Swing程序,卻提示錯(cuò)誤),要了解問題可能產(chǎn)生的原因。
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注服務(wù)器之家的更多內(nèi)容!
原文鏈接:https://blog.csdn.net/zhrb/article/details/119305559