Java概述(建築專業的Java小白)
Java 簡介
什麼是 Java
Java 是一門面向物件程式語言,不僅吸收了 C++ 語言的各種優點,還摒棄了 C++ 裡難以理解的多繼承、指標等概念,因此 Java 語言具有功能強大和簡單易用兩個特徵。Java 語言作為靜態面向物件程式語言的代表,極好地實現了面向物件理論,允許程式設計師以優雅的思維方式進行復雜的程式設計 。
誕生背景
任職於 Sun 公司 (Stanford University Network 斯坦福網路公司) 的詹姆斯 · 高斯林和麥克 · 舍林丹等人於 1990 年代初開發 Java 語言的雛形,最初被命名為 Oak,Oak 的目標是作為家用電器等小型系統的程式語言,用於電視機、電話、鬧鐘、烤麵包機等家用電器的控制和通訊。由於這些智慧化家電的市場需求沒有預期的高,Sun 公司放棄了該項計劃。隨著 1990 年代網際網路的發展,Sun 公司發現 Oak 在網際網路上應用的前景,於是改造了 Oak,於 1995 年 5 月以 Java 的名稱正式釋出。伴隨著網際網路的迅猛發展,Java 逐漸成為重要的網路程式語言。
三大版本
Java SE(J2SE,Java 2 Platform Standard Edition,標準版)
- Java SE 以前稱為 J2SE。它允許開發和部署在桌面、伺服器、嵌入式環境和實時環境中使用的 Java 應用程式。Java SE 包含了支援 Java Web 服務開發的類,併為 Java EE 和 Java ME 提供基礎。
Java EE(J2EE,Java 2 Platform Enterprise Edition,企業版)
- Java EE 以前稱為 J2EE。企業版本幫助開發和部署可移植、健壯、可伸縮且安全的伺服器端 Java 應用程式。Java EE 是在 Java SE 的基礎上構建的,它提供 Web 服務、元件模型、管理和通訊 API,可以用來實現企業級的面向服務體系結構(service-oriented architecture,SOA)和 Web2.0 應用程式。2018 年 2 月,Eclipse 宣佈正式將 JavaEE 更名為 JakartaEE
Java ME(J2ME,Java 2 Platform Micro Edition,微型版)
- Java ME 以前稱為 J2ME。Java ME 為在移動裝置和嵌入式裝置(比如手機、PDA、電視機頂盒和印表機)上執行的應用程式提供一個健壯且靈活的環境。Java ME 包括靈活的使用者介面、健壯的安全模型、許多內建的網路協議以及對可以動態下載的連網和離線應用程式的豐富支援。基於 Java ME 規範的應用程式只需編寫一次,就可以用於許多裝置,而且可以利用每個裝置的本機功能。
語言特點與應用場景
Java 語言具有簡單性、面向物件、分散式、健壯性、安全性、跨平臺性、可移植性、多執行緒與動態性等特點。Java 語言可以編寫桌面應用程式、Web 應用程式、分散式系統和嵌入式系統等 。Java 快速、安全、可靠。從膝上型電腦到資料中心,從遊戲控制檯到超級計算機,從手機到網際網路,Java 無處不在!
Java 技術體系
下圖為 Oracle 官網提供的 Java 技術體系圖
JVM、JRE 和 JDK 的關係
JVM
Java Virtual Machine 是 Java 虛擬機器,Java 程式需要執行在虛擬機器上,不同的平臺有自己的虛擬機器,因此 Java 語言可以實現跨平臺。
JRE
Java Runtime Environment 包括 Java 虛擬機器和 Java 程式所需的核心類庫等。核心類庫主要是 java.lang 包:包含了執行 Java 程式必不可少的系統類,如基本資料型別、基本數學函式、字串處理、執行緒、異常處理類等,系統預設載入這個包
如果想要執行一個開發好的 Java 程式,計算機中只需要安裝 JRE 即可。
JDK
Java Development Kit 是提供給 Java 開發人員使用的,其中包含了 Java 的開發工具,也包括了 JRE。所以安裝了 JDK,就無需再單獨安裝 JRE 了。其中的開發工具:編譯工具 (javac.exe),打包工具(jar.exe) 等
JVM&JRE&JDK 關係圖
Java 語言特點
Java 語言是簡單的
- Java 語言的語法與 C 語言和 C++ 語言很接近,從某種意義上講,它是由 C 和 C++ 演變而來,使得大多數程式設計師很容易學習和使用。
- 對 C++ 來說進行了簡化和一定的提高,如:使用介面代替了複雜的多重繼承以及取消了指標,還通過實現垃圾自動回收機制,大大簡化了程式設計師的資源釋放管理工作。
- 提供了豐富的類庫和 API 文件,以及第三方開發包工具包,還有大量的基於 Java 的開源專案,幫助程式設計人員參考學習,JDK 就是開放的原始碼之一,讀者可以通過分析專案的原始碼,來提高自己的程式設計水平。
Java 語言是面向物件的
面向物件就是 Java 語言的基礎,也是 Java 語言的重要特性。面向物件是指以物件為基本單元,包含屬性和方法。物件的狀態用屬性表達,物件的行為用方法表達。
面向物件技術使得應用程式的開發變得簡單易用,節省程式碼。總之,Java 語言是一個純面向物件的程式設計語言。
Java 語言是分散式的
- 分佈性主要包括兩大方面,分別是操作分佈和資料分佈,其中操作分佈指的是在多個不同的主機上佈置相關操作,資料分佈是將資料分別存放在多個網路中不同的主機上,藉助的是 URL(統一資源定位符)訪問網路物件,訪問方式和訪問本地系統相似。
- Java 語言具有一個強大的,易於使用的網路能力,這是非常適合於分散式計算程式的。
- Java 語言支援 Internet 應用的開發,在基本的 Java 應用程式設計介面中有一個網路應用程式設計介面 (java.net),它提供了用於網路應用程式設計的類庫,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(遠端方法啟用) 機制也是開發分散式應用的重要手段。
Java 語言是多執行緒的
多執行緒機制使應用程式在同一時間並行執行多項任務,Java 語言提供多執行緒之間的同步機制,這些相應的同步機制可以很好的保證不同執行緒,能夠正確的共享資料。多執行緒機制使程式具有更好的互動性和實時性。
Java 語言是高效能的
- Java 是一種先編譯後解釋的語言,所以它不如全編譯性語言快。但是有些情況下效能是很要緊的,為了支援這些情況,Java 設計者製作了 “及時” 編譯程式,它能在執行時把 Java 位元組碼翻譯成特定 CPU(中央處理器)的機器程式碼,也就是實現全編譯了。Java 位元組碼格式設計時考慮到這些 “及時” 編譯程式的需要,所以生成機器程式碼的過程相當簡單,它能產生相當好的程式碼。
- 與那些解釋型的高階指令碼語言相比,Java 的確是高效能的。事實上,Java 的執行速度隨著 JIT(Just-In-Time)編譯器技術的發展越來越接近於 C++。
Java 語言是跨平臺的
- 所謂的跨平臺性,是指軟體可以不受計算機硬體和作業系統的約束而在任意計算機環境下正常執行。這是軟體發展的趨勢和程式設計人員追求的目標。之所以這樣說,是因為計算機硬體的種類繁多,作業系統也各不相同,不同的使用者和公司有自己不同的計算機環境偏好,而軟體為了能在這些不同的環境里正常執行,就需要獨立於這些平臺。
- 在 Java 語言中,Java 自帶的虛擬機器很好地實現了跨平臺性。Java 原始碼經過編譯後生成二進位制的位元組碼是與平臺無關的,Java 虛擬機器在執行位元組碼時,把位元組碼解釋成具體平臺上的機器指令執行。這就是 Java 的能夠 Write once, run anywhere(一次編譯,到處執行) 的原因。Java 虛擬機器提供了一個位元組碼到底層硬體平臺及作業系統的屏障,使得 Java 語言具備跨平臺性。
Java 語言是可移植的
可移植性來源於跨平臺性性,另外,Java 還嚴格規定了各個基本資料型別的長度。Java 系統本身也具有很強的可移植性,Java 編譯器是用 Java 實現的,Java 的執行環境是用 ANSI C 實現的。
Java 語言是安全的
在 Java 語言中刪除了類似於 C 語言中的指標和內容釋放等語法,有效的避免了非法操作記憶體,程式碼要經過校驗之後才能夠執行,所以未經允許的 Java 程式不可能出現損害系統平臺的行為,最大的好處就是,Java 可以編寫防病毒和可修復的系統,Java 通常被用在網路環境中,為此,Java 提供了一個安全機制以防惡意程式碼的攻擊,從而可以提高系統的安全性。
Java 語言是健壯的
Java 語言的強型別機制、異常處理、垃圾的自動收集等是 Java 程式健壯性的重要保證。對指標的丟棄是 Java 的明智選擇。Java 的安全檢查機制使得 Java 更具健壯性。
Java 語言是動態的
- Java 語言的設計目標之一是適應於動態變化的環境。Java 程式需要的類能夠動態地被載入到執行環境,也可以通過網路來載入所需要的類,這也有利於軟體的升級。
- Java 中的類有一個執行時刻的表示,能進行執行時刻的型別檢查。
Java 是編譯型還是解釋型語言
1. 編譯型語言和解釋型語言
編譯型語言
定義:在程式執行之前,通過編譯器將源程式編譯成機器碼 (可執行的二進位制程式碼),以後執行這個程式時,就不用再進行編譯了。
優點:編譯器一般會有預編譯的過程對程式碼進行優化。因為編譯只做一次,執行時不需要編譯,所以編譯型語言的程式執行效率高,可以脫離語言環境獨立執行。
缺點:編譯之後如果需要修改就需要整個模組重新編譯。編譯的時候根據對應的執行環境生成機器碼,不同的作業系統之間移植就會有問題,需要根據執行的作業系統環境編譯不同的可執行檔案。
總結:執行速度快、效率高;依靠編譯器、跨平臺性差些。
代表語言:C、C++、Pascal、Object-C 以及 Swift。
解釋型語言
定義:解釋型語言的原始碼不是直接翻譯成機器碼,而是先翻譯成中間程式碼,再由直譯器對中間程式碼進行解釋執行。在執行的時候才將源程式翻譯成機器碼,翻譯一句,然後執行一句,直至結束。
優點:有良好的平臺相容性,在任何環境中都可以執行,前提是安裝瞭解釋器(虛擬機器)。靈活,修改程式碼的時候直接修改就可以,可以快速部署,不用停機維護。
缺點:每次執行的時候都要解釋一遍,效能上不如編譯型語言。
總結:執行速度慢、效率低;依靠直譯器、跨平臺性好。
代表語言:JavaScript、Python、Erlang、PHP、Perl、Ruby。
混合型語言
定義:既然編譯型和解釋型各有缺點就會有人想到把兩種型別整合起來,取其精華去其糟粕,就出現了半編譯,半解釋型語言。
比如 C#,C# 在編譯的時候不是直接編譯成機器碼而是中間碼,.NET 平臺提供了中間語言執行庫執行中間碼,中間語言執行庫類似於 Java 虛擬機器。.NET 在編譯成 IL 程式碼後,儲存在 dll 中,首次執行時由 JIT 在編譯成機器碼快取在記憶體中,下次直接執行。嚴格來說混合型語言屬於解釋型語言,C# 更接近編譯型語言。
Java 即是編譯型的,也是解釋型語言,總的來說 Java 更接近解釋型語言。
- 可以說它是編譯型的。因為所有的 Java 程式碼都是要編譯的,.java 不經過編譯就什麼用都沒有。同時圍繞 JVM 的效率問題,會涉及一些如 JIT、AOT 等優化技術,例如 JIT 技術,會將熱點程式碼編譯成機器碼。而 AOT 技術,是在執行前,通過工具直接將位元組碼轉換為機器碼。
- 可以說它是解釋型的。因為 Java 程式碼編譯後不能直接執行,它是解釋執行在 JVM 上的,所以它是解釋執行的。
2. 動態型別語言和靜態型別語言
動態型別語言
動態型別語言:在執行期間才去做資料型別檢查的語言,說的是資料型別。動態型別語言的資料型別不是在編譯階段決定的,而是把型別繫結延後到了執行階段。
代表語言:Python、Ruby、Erlang、JavaScript、Swift、PHP、Perl。
靜態型別語言
靜態型別語言的資料型別是在編譯期間(或執行之前)確定的,編寫程式碼的時候要明確確定變數的資料型別。
代表語言:C、C++、C#、Java、Object-C。
3. 動態語言和靜態語言
動態語言
動態型別語言和動態語言是完全不同的兩個概念。
動態語言:說的是執行時改變結構,說的是程式碼結構。在執行時可以改變其結構的語言:例如新的函式、物件、甚至程式碼可以被引進,已有的函式可以被刪除或是其他結構上的變化。通俗點說就是在執行時程式碼可以根據某些條件改變自身結構。
代表語言:Object-C、C#、JavaScript、PHP、Python、Erlang。
靜態語言
與動態語言相對應的,執行時結構不可變的語言就是靜態語言。如 Java、C、C++。