# Java介紹 ###### tags: `java` ## 目錄 [程式語言類型](#程式語言類型) [歷史典故](#歷史典故) [優勢](#優勢) [常見名詞解說](#常見名詞解說) [其它](#其它) ## 程式語言 程式語言(Programming Language)本質上就是一種語言,人類語言的目的用在人與人之間的溝通,而程式語言則是用來跟電腦溝通。 #### 類型 - 編譯型語言 程式必須經過一個編譯和一個連結階段來變成一個獨立的執行檔案,優點是執行效率高,缺點是開發較不方便。 - 解譯型語言(或稱為腳本語言) 程式需經過解譯器來執行,優點是容易跨平台,缺點是執行速度較編譯型語言慢。 ## 歷史典故 Java(英式發音[ˈʤɑːvə],美式發音[ˈʤɑvə])是一種廣泛使用的電腦程式設計語言,擁有跨平台、物件導向、泛型程式設計的特性,廣泛應用於企業級Web應用開發和行動應用開發。 任職於昇陽電腦的詹姆斯·高斯林等人於1990年代初開發Java語言的雛形,最初被命名為Oak,目標設定在家用電器等小型系統的程式語言,應用在電視機、電話、鬧鐘、烤麵包機等家用電器的控制和通訊。由於這些智慧型家電的市場需求沒有預期的高,昇陽電腦系統(Sun公司)放棄了該項計劃。隨著1990年代網際網路的發展,Sun公司看見Oak在網際網路上應用的前景,於是改造了Oak,於1995年5月以Java的名稱正式釋出。Java伴隨著網際網路的迅猛發展而發展,逐漸成為重要的網路程式語言。 Java程式語言的風格十分接近C++語言。繼承了C++語言物件導向技術的核心,捨棄了容易引起錯誤的指標,以參照取代;移除了C++中的運算子重載和多重繼承特性,用介面取代;增加垃圾回收器功能。在Java SE 1.5版本中引入了泛型程式設計、類型安全的列舉、不定長參數和自動裝/拆箱特性。昇陽電腦對Java語言的解釋是:「Java程式語言是個簡單、物件導向、分散式、解釋性、健壯、安全、與系統無關、可移植、高效能、多執行緒和動態的語言」。 Java不同於一般的編譯語言或直譯語言。它首先將原始碼編譯成位元組碼,再依賴各種不同平台上的虛擬機器來解釋執行位元組碼,從而具有「一次編寫,到處執行」的跨平台特性。在早期JVM中,這在一定程度上降低了Java程式的執行效率。但在J2SE1.4.2釋出後,Java的執行速度有了大幅提升。 與傳統型態不同,Sun公司在推出Java時就將其作為開放的技術。全球的Java開發公司被要求所設計的Java軟體必須相互相容。「Java語言靠群體的力量而非公司的力量」是Sun公司的口號之一,並獲得了廣大軟體開發商的認同。這與微軟公司所倡導的注重精英和封閉式的模式完全不同,此外,微軟公司後來推出了與之競爭的.NET平台以及模仿Java的C#語言。後來Sun公司被甲骨文公司併購,Java也隨之成為甲骨文公司的產品。 現時,行動作業系統Android大部分的代碼採用Java程式設計語言編程。 > 本節內容節錄自維基百科 ## 優勢 #### 市場需求高 根據 [TIOBE](https://www.tiobe.com/tiobe-index/) 程式語言排名,Java 在 2021 仍然是非常熱門的程式語言。 所以熟練 Java 在短時間內絕對不會找不到工作,市場需求非常高。 ![](imgs/tiobe-index.png) #### 跨平台、相容性高 前面有提到 Java 最大的特色「一次編寫,隨處運行」。 對於一個工程師而言,寫出來的程式如果不需修改,就能夠同時在 Windows、MacOS、Linux 等平臺上執行,簡直就是美夢成真的好事,而 Java 就讓這個原本遙不可及的事離我們越來越近。 使用 Java 編寫的程式,只要做較少的修改,甚至有時根本不需修改就可以在不同平臺上執行了,Java 絕對是跨平臺的一門程式語言。 #### 安全性高 由於 Java 語言在設計時,在安全性方面考慮很仔細,做了許多探究,使得 Java 成為非常安全的一種程式設計語言。 雖然後來興起的語言,想是 Python、Ruby 都比 Java 更安全,但 Java 還是遠比 C 語言來的安全。 #### 應用多元 ##### 開發 Android APP 我們最常見的 Android APP 主要是由兩種 Java 或是 Kotlin 撰寫而成,而 Java 又是主要的開發語言,Kotlin 是比較後期興起的。 許多人開發 APP 都會使用 [Android Studio](https://developer.android.com/studio),使用的程式語言就是 Java。 因此如果想開發 Android APP,一定要學習 Java。 ##### 架設網站 Java 也是做網站的主流語言,在電子商務和網站開發上有著廣泛的運用。 像是可以使用 SpringMVC、Apache Struts 2 等等框架開發網站。 或是較簡單的 Servlet、JSP 也是常常被政府機關、中小企業使用。 許多政府、醫療、保險、教育、國防和其他部門的網站都是建立在 java 之上的。 ##### 物聯網應用程式 對於物聯網開發來說,主要的程式語言是 Java、C、C ++、Python 等等。 而 Java 為開發人員提供了無與倫比的優勢。 因為 Java 的**靈活性**和**多功能性**,可以讓應用程式「**一次編寫,隨處運行**」。 也就是**解決跨平台、跨裝置的問題**。 因此 Java 是開發物聯網應用程式的普遍選擇。 ##### 大數據分析 知名處理大數據的軟體平台 [Hadoop](https://hadoop.apache.org/) 就是以 Java為 框架來進行撰寫的,這讓大家對於Java可以創建的商機有了更多的想像。 但大數據目前有更多人使用 Python 來處理,不過只要 Hadoop 還存在,Java 還有一席之地。 ##### 金融業的帳務處理 許多金融業的應用都是由 Java 撰寫而成,像是高盛投資公司、花旗集團,和一些其他銀行都用 Java 撰寫前台和後台的電子交易系統,結算、信息確認系統,數據處理項目等等。 Java 可以安全的處理這些複雜的運算系統,讓金融業更方便。 Java 提供交易員一個更方便處理客戶需求的平台,能夠讓工作運行的更為順暢。 ##### 桌面應用程式 JavaSwing由於能開發出圖形用戶介面的客戶端供交易者使用而備受歡迎。 我們電腦上所安裝的應用程式介面,大多都是由 Java 製作而成。 Swing 是一個為 Java 設計的 GUI 工具包,屬於Java基礎類的一部分。 Swing 包括了圖形化使用者介面 (GUI) 功能,其組件包含:文字方塊、文字域、按鈕、表格、列表……等等。 許多電腦上的軟體介面,就是由 Java 的 Swing 製作而成。 ## 劣勢 #### 執行速度緩慢 Java 因為功能強大,在一些記憶體處理、資源清理的部分並沒有做的比 C、C++ 來的好,所以相較之下速度比較緩慢。 不過我常常宣導一個理念,就像做網站一樣,功能越多當然速度越慢,看自己的取捨。 #### 編譯過程繁瑣 Java、C、C++ 都是屬於編譯式語言,在執行前都需要先編譯過,並不像 Python 這種直譯式語言,可以直接運行。 而且我個人滿不喜歡 Java 的編譯過程,環境算是滿複雜的,我會使用 Eclipse來輔助。 ## 特性 Java之所以被開發,是要達到以下五個目的: - 應當使用物件導向程式設計方法學 - 應當允許同一程式在不同的電腦平台執行 - 應當包括內建的對電腦網路的支援 - 應當被設計成安全地執行遠端程式碼 - 應當易於使用,並借鑑以前那些物件導向語言(如C++)的長處。 Java技術主要分成幾個部分:Java語言、Java執行環境、類別庫。一般情況下說Java時並不區分指的是哪個部分。 Java在1.5版本時,做了重大改變,Sun公司並1.5版本重新命名為Java 5.0。 #### 物件導向 Java的特點之一就是物件導向,是程式設計方法的一種。「物件導向程式設計語言」的核心之一就是開發者在設計軟體的時候可以使用自訂的類型和關聯操作。程式碼和資料的實際集合體叫做「物件」。一個物件可以想像成繫結了很多「行為(程式碼)」和「狀態(資料)」的物體。對於資料結構的改變需要和程式碼進行通信然後操作,反之亦然。物件導向設計讓大型軟體工程的計劃和設計變得更容易管理,能增強工程的健康度,減少失敗工程的數量。 #### 跨平台性 跨平台性是Java主要的特性之一,跨平台使得用Java語言編寫的程式可以在編譯後不用經過任何更改,就能在任何硬體裝置條件下執行。這個特性經常被稱為「一次編譯,到處執行」。 執行Java應用程式必須安裝Java 執行時環境(Java Runtime Environment,JRE),JRE包括Java虛擬機器(Java Virtual Machine,JVM),以及Java平台核心類和基礎Java 平台庫。[16]通過JVM才能在電腦系統執行Java應用程式(Java Application),這與.Net Framework的情況一樣,所以電腦上沒有安裝JVM,那麼這些java程式將不能夠執行。 實現跨平台性的方法是大多數編譯器在進行Java語言程式的編碼時候會生成一個用位元組碼寫成的「半成品」,這個「半成品」會在Java虛擬機器(解釋層)的幫助下執行,虛擬機器會把它轉換成當前所處硬體平台的原始程式碼。之後,Java虛擬機器會打開標準庫,進行資料(圖片、執行緒和網路)的存取工作。主要注意的是,儘管已經存在一個進行程式碼翻譯的解釋層,有些時候Java的位元組碼程式碼還是會被JIT編譯器進行二次編譯。 有些編譯器,比如GCJ,可以自動生成原始程式碼而不需要解釋層。但是這些編譯器所生成的程式碼只能應用於特定平台。並且GCJ目前只支援部分的Java API。 甲骨文公司對於Java的授權是「全相容的」,這也導致了微軟和昇陽關於微軟的程式不支援RMI和JNI介面、並且增加特性為己所用的法律爭端。昇陽最終贏得了官司,獲得了大約兩千萬美元的賠償,法院強制要求微軟執行昇陽公司關於Java的授權要求。作為回應,微軟不再在Windows系統中捆綁Java,最新的Windows版本,Windows Vista和Internet Explorer 7.0版本也不再提供對於Java應用程式和控制項的支援。但是昇陽公司和其他使用Java執行時系統的公司在Windows作業系統下對使用者提供無償的第三方外掛程式和程式支援。 Java語言使用解釋層最初是為了輕巧性。所以這些程式的執行效率比C語言和C++要低很多,使用者也對此頗有微詞。很多最近的調查顯示Java的程式執行速度比幾年前要高出許多,有些同樣功能的程式的效率甚至超過了C++和C語言編寫的程式。 Java語言在最開始應用的時候是沒有解釋層的,所有需要編譯的程式碼都直接轉換成機器的原始程式碼。這樣做雖然使程式獲得了最佳的效能,但是導致程式異常臃腫。從JIT技術開始,Java的程式都經過一次轉換之後才變成機器碼。很多老牌的第三方虛擬機器都使用一種叫做「動態編譯」的技術,也就是說虛擬機器即時監測和分析程式的執行行為,同時選擇性地對程式所需要的部分進行編譯和最佳化。所有這些技術都改善了程式碼的執行速度,但是又不會讓程式的體積變得失常。 程式的輕便性事實上是軟體編寫很難達到的一個目標,Java雖然成功地實現了「一次編譯,到處執行」,但是由於平台和平台之間的差異,所編寫的程式在轉換程式碼的時候難免會出現微小的、不可察覺的錯誤和意外。有些程式設計師對此非常頭疼,他們嘲笑Java的程式不是「一次編譯,到處執行」,而是「一次編譯,到處除錯」。以Java AWT為例,早期Java AWT內提供的按鈕、文字區等均是以電腦系統所預設的樣式而顯示。這令Java程式在有些沒有提供圖案的電腦系統產生錯誤(在Microsoft Windows設有視窗管理員,在一些Linux distribution則沒有)。後來SUN公司針對Java AWT一些問題而推出Java Swing。 平台無關性讓Java在伺服器端軟體領域非常成功。很多伺服器端軟體都使用Java或相關技術建立。 #### 自動垃圾回收(Garbage Collection) C++語言被使用者詬病的原因之一是大多數C++編譯器不支援垃圾收集機制。通常使用C++編程的時候,程式設計師於程式中初始化物件時,會在主機記憶體堆疊上分配一塊記憶體與位址,當不需要此物件時,進行解構或者刪除的時候再釋放分配的記憶體位址。如果物件是在堆疊上分配的,而程式員又忘記進行刪除,那麼就會造成記憶體洩漏(Memory Leak)。長此以往,程式運行的時候可能會生成很多不清除的垃圾,浪費了不必要的記憶體空間。而且如果同一記憶體位址被刪除兩次的話,程式會變得不穩定,甚至崩潰。因此有經驗的C++程式員都會在刪除之後將指標重設為NULL,然後在刪除之前先判斷指標是否為NULL。 C++中也可以使用「智慧型指標」(Smart Pointer)或者使用C++代管擴展編譯器的方法來實現自動化記憶體釋放,智慧型指標可以在標準類庫中找到,而C++代管擴展被微軟的Visual C++ 7.0及以上版本所支援。智慧型指標的優點是不需引入緩慢的垃圾收集機制,而且可以不考慮執行緒安全的問題,但是缺點是如果不善使用智慧型指標的話,效能有可能不如垃圾收集機制,而且不斷地分配和釋放記憶體可能造成記憶體碎片,需要手動對堆進行壓縮。除此之外,由於智慧型指標是一個基於模板的功能,所以沒有經驗的程式員在需要使用多態特性進行自動清理時也可能束手無策。 Java語言則不同,上述的情況被自動垃圾收集功能自動處理。物件的建立和放置都是在記憶體堆疊上面進行的。當一個物件沒有任何參照的時候,Java的自動垃圾收集機制就發揮作用,自動刪除這個物件所佔用的空間,釋放記憶體以避免記憶體洩漏。 注意程式設計師不需要修改finalize方法,自動垃圾收集也會發生作用。但是記憶體洩漏並不是就此避免了,當程式員疏忽大意地忘記解除一個物件不應該有的參照時,記憶體洩漏仍然不可避免。 不同廠商、不同版本的JVM中的記憶體垃圾回收機制並不完全一樣,通常越新版本的記憶體回收機制越快,IBM、BEA、SUN等等開發JVM的公司都曾宣稱過自己製造出了世界上最快的JVM,JVM效能的世界紀錄也在不斷的被打破並提高。 IBM有一篇有關Java記憶體回收機制比不啟用垃圾收集機制的C++記憶體處理快數倍的技術文章[17],而著名的Java技術書籍《Java編程思想》(Thinking in Java)也有一段論述Java記憶體及效能達到甚至超過C++的章節[18]。 #### 基本語法 編寫Java程式前應注意以下幾點: - 大小寫敏感:Java是大小寫敏感的,這就意味著識別碼Hello與hello是不同的。 類名:對於所有的類來說,類名的首字母應該大寫。如果類名由若干單詞組成,那麼每個單詞的首字母應該大寫,例如MyFirstJavaClass。 - 方法名:所有的方法名都應該以小寫字母開頭。如果方法名含有若干單詞,則後面的每個單詞首字母大寫,例如myFirstJavaMethod。 - 原始檔名:原始檔名必須和檔案內名字唯一且公開(由public 關鍵詞修飾)的類名相同。當儲存檔案的時候,你應該使用該類名作為檔名儲存(切記Java是大小寫敏感的),檔名的字尾為.java。(如果檔名和類名不相同則會導致編譯錯誤)。 - 程式進入點:所有的Java程式由`public static void main(String[] args)`方法開始執行。 ## 常見名詞解說 | 名詞 | 描述 | | ------- | ------------------------------------ | | JDK | Java開發環境套件 | | JRE | Java執行環境套件 | | JVM | 執行Java的虛擬機 | | Eclipse | 古老的Java整合式開發環境 | | Maven | 專案自動化建置工具 | | LTS | 長期支援,該版本可以或較長時間的更新 | JDK 包含以下三個大元件: 1. Java 程式語言 2. 工具程式,如 javac、javadoc 等 3. JRE,裡面包含了 Java SE API、JVM > **補充** > > Java維基百科:https://zh.wikipedia.org/wiki/Java%E7%89%88%E6%9C%AC%E6%AD%B7%E5%8F%B2