# 1. Java語言概述 ## 1.1 Java概述 - 是`SUN`(`Stanford University Network`,斯坦福大學網路公司)1995年推出的一門高級編程語言。 - 是一種`面向Internet`的編程語言。Java一開始富有吸引力是因為Java程式可以在Web瀏覽器中運 ...
1. Java語言概述
1.1 Java概述
-
是
SUN
(Stanford University Network
,斯坦福大學網路公司)1995年推出的一門高級編程語言。 -
是一種
面向Internet
的編程語言。Java一開始富有吸引力是因為Java程式可以在Web瀏覽器中運行。這些Java程式被稱為Java小程式(Applet),內嵌在HTML代碼中。 -
伴隨著互聯網的迅猛發展,以及Java技術在web方面的不斷成熟,已經成為Web應用程式的首選開發語言。
1.2 Java語言簡史
起步階段:
1991年,Sun公司的工程師小組想要設計一種語言,應用在家用電器的控制和通信。由於這些設備的處理能力和記憶體都很有限,並且不同的廠商會選擇不同的中央處理器(CPU),因此這種語言的關鍵是:代碼短小、緊湊且與平臺無關
。
Gosling團隊率先創造了這個語言,並命名為“Oak"。後因智能化家電的市場需求沒有預期的高,Sun公司放棄了該項計劃。
隨著20世紀90年代互聯網的發展,Sun公司發現該語言在互聯網上應用的前景,於是改造了Oak,於1995年5月以Java的名稱正式發佈。
發展階段:
發行版本 | 發行時間 | 備註 |
---|---|---|
Java 1.0 | 1996.01.23 | Sun公司發佈了Java的第一個開發工具包 |
Java 1.1 | 1997.02.19 | JavaOne會議召開,創當時全球同類會議規模之最。 |
Java 1.2 | 1998.12.08 | Java拆分成:J2SE(標準版)、J2EE(企業版)、J2ME(小型版) |
Java 1.3 | 2000.05.08 | |
Java1.4 | 2004.02.06 | |
Java 5.0 | 2004.09.30 | ①版本號從1.4直接更新至5.0;②平臺更名為JavaSE、JavaEE、JavaME |
Java 6.0 | 2006.12.11 | 2009.04.20 Oracle宣佈收購SUN公司 |
2009.04.20 | Oracle公司收購SUN,交易價格74億 美元。 |
|
Java 7.0 | 2011.07.02 | |
Java 8.0 | 2014.03.18 | 此版本是繼Java 5.0以來變化最大的版本。是長期支持版本(LTS) |
Java 9.0 | 2017.09.22 | ①此版本開始,每半年更新一次;②Java 9.0開始不再支持windows 32位系統 |
Java 10.0 | 2018.03.21 | |
Java 11.0 | 2018.09.25 | JDK安裝包取消獨立JRE安裝包,是長期支持版本(LTS) |
Java 12.0 | 2019.03.19 | |
... | ... | |
Java17.0 | 2021.09 | 發佈Java 17.0,版本號也稱為21.9,是長期支持版本。 |
... | ... | |
Java19.0 | 2022.09 | 發佈Java19.0,版本號也稱為22.9。 |
... | ... |
補充:Java之父——詹姆斯·高斯林(James Gosling)
詹姆斯·高斯林(James Gosling)先生以“Java 技術之父”而聞名於世。他是Java 技術的創始人,他親手設計了Java語言,並開發了Java編譯器和Java虛擬機,使Java成為了世界上最流行的開發語言。
James Gosling於1984 年加入Sun公司,並一直服務於Sun公司,直至2010年前後,Sun被Oracle併購而加入Oracle,擔任客戶端軟體集團的首席技術官; 2010年4月從Oracle離職。
1.3 Java技術體系平臺
- Java SE(Java Standard Edition)標準版
- 支持面向桌面級應用(如Windows下的應用程式)的Java平臺,即
定位個人電腦的應用開發
。 - 包括用戶界面介面AWT及Swing,網路功能與國際化、圖像處理能力以及輸入輸出支持等。
- 此版本以前稱為J2SE
- 支持面向桌面級應用(如Windows下的應用程式)的Java平臺,即
- Java EE(Java Enterprise Edition)企業版
- 為開發企業環境下的應用程式提供的一套解決方案,即
定位在伺服器端的Web應用開發
。 - JavaEE是JavaSE的擴展,增加了用於伺服器開發的類庫。如:Servlet能夠延伸伺服器的功能,通過請求-響應的模式來處理客戶端的請求;JSP是一種可以將Java程式代碼內嵌在網頁內的技術。
- 版本以前稱為J2EE
- 為開發企業環境下的應用程式提供的一套解決方案,即
- Java ME(Java Micro Edition)小型版
- 支持Java程式運行在移動終端(手機、機頂盒)上的平臺,即
定位在消費性電子產品的應用開發
。 - JavaME是JavaSE的內伸,精簡了JavaSE 的核心類庫,同時也提供自己的擴展類。增加了適合微小裝置的類庫:javax.microedition.io.*等。
- 此版本以前稱為J2ME
- 支持Java程式運行在移動終端(手機、機頂盒)上的平臺,即
註意:Android開發不等同於Java ME的開發。
2. Java開發環境搭建
2.1 什麼是JDK、JRE
- JDK(Java Development Kit):是Java程式開發工具包,包含
JRE
和開發人員使用的工具。 - JRE(Java Runtime Environment):是Java程式的運行時環境,包含
JVM
和運行時所需要的核心類庫
。
如下是Java 8.0 Platform:
2.2 JDK版本選擇
- 八爺黨:堅守Java的陣地,雖然Java如今都已經進入了20年代,但是依然是一些開發環境的主陣地。
- 革命黨:適應接受新的穩定版本。給開發者帶來更加便利高效的體驗。例如:
G1收集器
:最受歡迎的GC演算法。Java 11及更高版本的G1收集器是預設的GC,而Java 8中並不是。框架反推著開發人員使用更高的版本
。在Java 17正式發佈之前,Java開發框架Spring率先在官博宣佈,Spring Framework 6和Spring Boot 3計劃在2022年第四季度實現總體可用性的高端基線。意味著springboot3.0 是需要用java17和spring6.0為基礎建設。如果從企業選型最新springboot3.0作為架構來說,它搭配jdk17肯定是標配了。
2.3 JDK的下載
- 下載網址(Oracle公司官網):www.oracle.com
- 下載步驟:如圖所示,在官網底部選擇Developers開發者
(1)在Developers頁面中間的技術分類部分,選擇Java
,單擊進入,如圖所示:
(2)這裡展示的是最新Java版本,例如Java20。下滑到 Java SE 欄目的位置。單擊Download Oracle JDK
,然後選擇具體的版本下載。
(3)選擇Download Oracle JDK按鈕後,進入Download Java界面。選擇對應版本點擊下載鏈接下載。
(4)如果想安裝Java 8版本的話,可以在當前頁面繼續下滑到如下位置:
(5)選擇Accept License Agreement,點擊下載。
(6)註冊或登錄後下載:
(7)如果需要安裝其它歷史版本,可以選擇 Java archive
:
接著進行選擇下載即可。
2.4 JDK的安裝
- 安裝說明
- 傻瓜式安裝,下一步即可。
- 建議:安裝路徑不要有中文或者空格等特殊符號。
- 以JDK17版本為例。
- 安裝步驟:
(1)雙擊jdk-17_windows-x64_bin.exe
文件,並單擊下一步,如圖所示:
(2)修改安裝路徑,單擊更改,如圖所示:
(3)將安裝路徑修改為D:\develop_tools\jdk\jdk-17.0.2\
,並單擊下一步,如圖所示:
(4)稍後幾秒,安裝完成,如圖所示:
2.5 配置path環境變數
為什麼配置path?
- path環境變數是window操作系統執行命令時,所要搜尋的路徑。
- 希望在命令行使用
javac.exe
等工具時,任意目錄下都可以找到這個工具所在的目錄。
JDK8配置方案:配置JAVA_HOME+path(推薦)
- 步驟:
(1)打開桌面上的電腦,進入後在左側找到電腦
,單擊滑鼠右鍵
,選擇屬性
,如圖所示:
(2)選擇高級系統設置
,如圖所示:
(3)在高級
選項卡,單擊環境變數
,如圖所示:
(4)在系統變數
中,單擊新建
,創建新的環境變數,如圖所示:
(5)變數名輸入JAVA_HOME
,變數值輸入 D:\develop_tools\jdk\jdk1.8.0_271
,單擊確定
,如圖所示:
(6)選中Path
環境變數,雙擊
或者點擊編輯
,如圖所示:
(7)在變數值的最前面,鍵入%JAVA_HOME%\bin
。如圖所示:
註意:強烈建議將
%JAVA_HOME%\bin
聲明在path環境變數中所有變數的最前面!
(8)環境變數配置完成,重啟DOS命令行,在任意目錄下輸入javac
或java
命令或java -version
,運行成功。
配置classpath,用於指名class文件識別的路徑。其實是沒必要的。
小結如下:
JDK17配置方案:自動配置
在我們安裝完JDK17之後,理應按JDK8的方式配置path環境變數。但是,我們發現在安裝完JDK17以後,配置環境變數之前,執行CMD指令:
竟然成功了!而且是17.0.2版本。因為JDK17在安裝之後,自動進行了環境變數的配置。如下:
這裡建議,將JDK17安裝的路徑,設置為JAVA_HOME
,並將%JAVA_HOME%\bin
上移到首位。
3. Java API文檔
-
API (Application Programming Interface,應用程式編程介面)是 Java 提供的基本編程介面。
-
Java語言提供了大量的基礎類,因此 Oracle 也為這些基礎類提供了相應的說明文檔,用於告訴開發者如何使用這些類,以及這些類里包含的方法。大多數Java書籍中的類的介紹都要參照它來完成,它是編程者經常查閱的資料。
-
Java API文檔,即為JDK使用說明書、幫助文檔。類似於字典。
-
下載API文檔:
4. Java核心機制:JVM
4.1 Java語言的優缺點
4.1.1 優點
-
跨平臺性:這是Java的核心優勢。Java在最初設計時就很註重移植和跨平臺性。比如:Java的int永遠都是32位。不像C++可能是16,32,可能是根據編譯器廠商規定的變化。
- 通過Java語言編寫的應用程式在不同的系統平臺上都可以運行。“
Write once , Run Anywhere
”。 - 原理:只要在需要運行 java 應用程式的操作系統上,先安裝一個Java虛擬機 (JVM ,Java Virtual Machine) 即可。由JVM來負責Java程式在該系統中的運行。
- 通過Java語言編寫的應用程式在不同的系統平臺上都可以運行。“
-
面向對象性:面向對象是一種程式設計技術,非常
適合大型軟體的設計和開發
。面向對象編程支持封裝、繼承、多態等特性,讓程式更好達到高內聚
,低耦合
的標準。 -
健壯性:吸收了C/C++語言的優點,但去掉了其影響程式健壯性的部分(如指針、記憶體的申請與釋放等),提供了一個相對安全的記憶體管理和訪問機制。
-
安全性高:Java適合於網路/分散式環境,需要提供一個安全機制以防惡意代碼的攻擊。如:
安全防範機制
(ClassLoader類載入器),可以分配不同的命名空間以防替代本地的同名類、位元組代碼檢查。 -
簡單性:Java就是C++語法的
簡化版
,我們也可以將Java稱之為“C++--
”。比如:頭文件,指針運算,結構,聯合,操作符重載,虛基類等。 -
高性能:
-
Java最初發展階段,總是被人詬病“
性能低
”;客觀上,高級語言運行效率總是低於低級語言的,這個無法避免。Java語言本身發展中通過虛擬機的優化提升了幾十倍運行效率
。比如,通過JIT(JUST IN TIME)即時編譯技術提高運行效率。 -
Java低性能的短腿,已經被完全解決了
。業界發展上,我們也看到很多C++應用轉到Java開發,很多C++程式員轉型為Java程式員。
-
4.1.2 缺點
語法過於複雜、嚴謹
,對程式員的約束比較多,與python、php等相比入門較難。但是一旦學會了,就業崗位需求量大,而且薪資待遇節節攀升
。- 一般適用於大型網站開發,
整個架構會比較重
,對於初創公司開發和維護人員的成本比較高(即薪資高),選擇用Java語言開髮網站或應用系統的需要一定的經濟實力。 並非適用於所有領域
。比如,Objective C、Swift在iOS設備上就有著無可取代的地位。瀏覽器中的處理幾乎完全由JavaScript掌控。Windows程式通常都用C++或C#編寫。Java在伺服器端編程和跨平臺客戶端應用領域則很有優勢。
4.2 JVM功能說明
JVM(J
ava V
irtual M
achine ,Java虛擬機):是一個虛擬的電腦,是Java程式的運行環境。JVM具有指令集並使用不同的存儲區域,負責執行指令,管理數據、記憶體、寄存器。
4.2.1 功能1:實現Java程式的跨平臺性
我們編寫的Java代碼,都運行在JVM 之上。正是因為有了JVM,才使得Java程式具備了跨平臺性。
使用JVM前後對比:
4.2.2 功能2:自動記憶體管理(記憶體分配、記憶體回收)
- Java程式在運行過程中,涉及到運算的
數據的分配
、存儲
等都由JVM來完成 - Java消除了程式員回收無用記憶體空間的職責。提供了一種系統級線程跟蹤存儲空間的分配情況,在記憶體空間達到相應閾值時,檢查並釋放可被釋放的存儲器空間。
- GC的自動回收,提高了記憶體空間的利用效率,也提高了編程人員的效率,很大程度上
減少了
因為沒有釋放空間而導致的記憶體泄漏
。
即使有
GC
的自動回收功能,Java程式還會出現記憶體溢出和記憶體泄漏問題!