一. 簡介
前言
????
由于國內(nèi).net市場日漸萎靡邻吭,越來越少的企業(yè)使用.net澄港,越來越多的企業(yè)投向JAVA的懷抱,一大批.net程序員的生存受到了極大的威脅, 在這生死存亡的時刻我們需要做出改變论笔,以順應(yīng)時代的變化男公!
為什么是JAVA
????
java從1995年誕生至今飽受爭議噪伊,風(fēng)風(fēng)雨雨已有20幾年的歷史囚戚,一路披荊斬棘,確定了自己的霸主地位酌摇,生命力頑強膝舅,常年雄踞編程排行榜第一位,就業(yè)廣泛窑多、待遇豐厚仍稀,使用JAVA的大廠有阿里巴巴、京東埂息、美團技潘、頭條判沟、拼多多、拍拍貸崭篡、攜程、微盟等等等等吧秕,其中京東琉闪、拍拍貸、攜程砸彬、微盟都是從.NET轉(zhuǎn)向JAVA颠毙。
????
什么跨平臺,面向?qū)ο缶筒徽f了砂碉,現(xiàn)在很多高級語言都有蛀蜜,一些特性,性能甚至比它還要好增蹭,就拿c#來對比滴某,單從語言層面來講要比JAVA優(yōu)秀的多。
????
現(xiàn)在看來最關(guān)鍵的還是強大的生態(tài)圈滋迈,在國內(nèi)又有阿里這種超級大廠支持霎奢,并開源了很多優(yōu)秀的框架和組件,給java程序員提供各種解決方案饼灿。
JAVA三大體系
- Java SE(Java2 Platform Standard Edition幕侠,標(biāo)準(zhǔn)版)
- Java EE(Java 2 Platform,Enterprise Edition,企業(yè)版)
- Java ME(Java 2 Platform Micro Edition碍彭,移動版)
每個版本有對應(yīng)的jdk(Orcale JDK和Open JDK)
JDK晤硕,JRE,JVM是什么
????
先了解下JDK庇忌,JRE舞箍,JVM是什么,他們之間有什么關(guān)系皆疹。
????
JVM :英文名稱(Java Virtual Machine)创译,就是我們常說的JAVA虛擬機,它能將JAVA源代碼編譯成的.class文件中的字節(jié)碼指令翻譯成計算機能識別的機器碼讓計算機執(zhí)行墙基,JVM是java跨平臺的核心软族。
????
JRE :英文名稱(Java Runtime Environment),Java 運行時環(huán)境残制。它主要包含兩個部分立砸,jvm 的標(biāo)準(zhǔn)實現(xiàn)和 Java 的一些基本類庫。它相對于 jvm 來說初茶,多出來的是一部分的 Java 類庫颗祝。
????
JDK :英文名稱(Java Development Kit),Java 開發(fā)工具包。jdk 是整個 Java 開發(fā)的核心螺戳,它集成了 jre 和一些好用的小工具搁宾。例如:javac.exe,java.exe倔幼,jar.exe 等盖腿。
????
顯然,這三者的關(guān)系是:一層層的嵌套關(guān)系损同。JDK>JRE>JVM翩腐。
????
JAVA開發(fā)人員只需要安裝JDK(JDk包含JRE,JVM)膏燃,非JAVA開發(fā)人員需要運行JAVA應(yīng)用的話茂卦,可單獨安裝JRE。
下載安裝配置
????
這里主要介紹下在windows環(huán)境下安裝和配置组哩,打開官網(wǎng)等龙,選擇Java SE版本選擇Oracle JDK:
點擊進(jìn)入下載頁面,接收協(xié)議伶贰,并且選擇適合自己版本的JDK而咆,這里我們選擇windows 64位jdk,如圖:
下載好之后進(jìn)行安裝幕袱,安裝完成之后我們來進(jìn)行環(huán)境變量配置暴备,以win10為例,右擊“此電腦”->"屬性"->“高級系統(tǒng)設(shè)置”->“高級”->"環(huán)境變量":
用戶變量是指當(dāng)前登錄的用戶们豌,系統(tǒng)變量是針對所有用戶涯捻,我們在系統(tǒng)變量里面設(shè)置,點擊新建:
1.設(shè)置JAVA_HOME變量望迎,變量名輸入“JAVA_HOME”障癌,變量值為jdk的安裝目錄,點擊確定辩尊。
然后在系統(tǒng)變量列表里面找到Path變量涛浙,點擊編輯,然后點擊新建:
輸入jdk安裝目錄下的bin目錄摄欲,點擊確定轿亮。
JAVA_HOME變量作用是和第三方軟件約定好引用jdk的目錄。
2.設(shè)置Path變量胸墙,Path變量是命令搜索變量我注,在cmd命令窗口下輸入命令會到指定的目錄搜索命令。
來寫一個HelloWorld
????
新建一個HelloWorld.java文件迟隅,打開文件輸入如下代碼:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
進(jìn)入cmd命令提示符窗口但骨,進(jìn)入文件當(dāng)前目錄励七,輸入:
javac HelloWorld.java
將java文件編譯為.class文件(字節(jié)碼文件),然后輸入:
java HelloWorld
運行程序奔缠。
[圖片上傳失敗...(image-2ecb1f-1554131747890)]
main方法是程序的入口掠抬,args是可以接收的參數(shù),我們將上面代碼改造一下:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("參數(shù)1:"+args[0]+"校哎,參數(shù)2:"+args[1]);
}
}
在cmd命令窗口輸入
javac -encoding utf-8 helloworld.java
(因為代碼包含中文两波,可能會亂碼導(dǎo)致無法編譯,所以使用-encoding utf-8指定編碼格式)編譯成class文件贬蛙,然后輸入運行命令
java HelloWorld 翠花 上菜
注意:
????
java類名必須和文件名相同(不區(qū)分大小寫),使用java命令運行程序時谚攒,java后面的名稱是類名稱(區(qū)分大小寫)阳准。
運行帶包名的類文件
????
我們看下帶包的類是如何編譯和運行的,先將上面的代碼再改造一下馏臭,改成帶包的類野蝇,在第一行加入如下代碼:
package cuihua;
完整代碼如下:
package cuihua;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
把上面的代碼放入名為cuihua的目錄,在當(dāng)前目錄輸入如下命令:
javac helloworld.java
java HelloWorld
[圖片上傳失敗...(image-842e4a-1554131747890)]
執(zhí)行java HelloWorld命令時報錯括儒,找不到入口绕沈,因為運行程序的時候是通過包名再找到類名,包名和目錄需要對應(yīng)帮寻,所以運行帶包名的類庫執(zhí)行命令時需要將包名帶上乍狐,執(zhí)行命令改為如下代碼:
java cuihua.HelloWorld
[圖片上傳失敗...(image-ab3bc2-1554131747890)]
還是報錯,我們仔細(xì)看下固逗,我們所在的目錄是cuihua浅蚪,cuihua下面沒有cuihua文件夾,所以需要返回上一級目錄烫罩,再執(zhí)行上面的命令惜傲,命令如下:
cd ../
java cuihua.HelloWorld
[圖片上傳失敗...(image-a3ce57-1554131747890)]
多層/多級包
????
有了前面的知識鋪墊之后,我們來思考一下如果包是多層的情況下贝攒,這個HelloWorld代碼怎么運行盗誊?現(xiàn)在我們將上面的包名修改一下,修改如下:
package cuihua.shangcai
完整代碼如下:
package cuihua.shangcai;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
這種情況下隘弊,該類文件應(yīng)該放在cuihua/shangcai目錄下哈踱,運行時在cuihua上一級目錄運行,在cmd命令窗口輸入如下代碼:
javac cuihua/shangcai/helloworld.java
java cuihua.shangcai.HelloWorld
[圖片上傳失敗...(image-9c0743-1554131747890)]
JAVA運行機制
????
java是一門高級語言梨熙,所寫的程序計算機是無法識別的嚣鄙,所以就需要一種解釋器將它翻譯成本地計算機能識別的機器語言,從我們寫的java程序到計算機能運行程序需要經(jīng)過兩個步驟串结,一個是將java源代碼編譯成與平臺無關(guān)的.class字節(jié)碼文件哑子,然后交給jvm逐行翻譯解釋本地計算機能識別的機器語言并運行舅列,所以我們通常所說的java跨平臺不是指的java語言本身跨平臺,而是jvm跨平臺卧蜓,jvm屏蔽了計算機平臺相關(guān)性帐要,每個計算機平臺都有單獨的jvm實現(xiàn),比如windows下可以安裝windows版的jre弥奸,mac下可以安裝mac版本的jre榨惠,linux下安裝linux版本的jre。
JIT編譯器
JIT也叫做即時編譯器盛霎,是一種動態(tài)編譯技術(shù)赠橙,起初java運行性能遠(yuǎn)低于c/c++ 這類靜態(tài)編譯語言,自從引入JIT編譯器之后愤炸,java可以提供與c/c++相當(dāng)?shù)男阅芷诰荆踔吝€會高于它們,javac屬于前端編譯规个,jit屬于后端編譯凤薛。
graph TD
字節(jié)碼文件 -->JIT編譯器
JIT編譯器 -->A{"是否已編譯本地機器碼"}
A --> |是| 執(zhí)行本地機器碼
A --> |否| 方法調(diào)用計數(shù)器+1
執(zhí)行本地機器碼
方法調(diào)用計數(shù)器+1 --> B{"計數(shù)器是否超過閾值"}
B --> |是| 向編譯器提交編譯請求
B --> |否| 以解釋方式執(zhí)行方法
向編譯器提交編譯請求 --> 以解釋方式執(zhí)行方法
以解釋方式執(zhí)行方法 --> 結(jié)束
執(zhí)行本地機器碼 --> 結(jié)束