如果你才剛開始學習 Java 程式設計,這裡有七個你需要知道的基礎知識。
Java 是一個多功能的程式語言,在某種程度上,它用在幾乎所有可能涉及計算機的行業了裡。Java 的最大優勢是,它執行在一個 Java 虛擬機器(JVM)中,這是一個翻譯 Java 程式碼為與作業系統相容的位元組碼的層。只要有 JVM 存在於你的作業系統上 —— 不管這個作業系統是在一個伺服器(或“無伺服器”,也是同樣的)、桌面電腦、筆記型電腦、移動裝置,或嵌入式裝置 —— 那麼,Java 應用程式就可以執行在它上面。
這使得 Java 成為程式設計師和使用者的一種流行語言。程式設計師知道,他們只需要寫一個軟體版本就能最終得到一個可以執行在任何平台上的應用程式;使用者知道,應用程式可以執行在他們的計算機上,而不用管他們使用的是什麼樣的作業系統。
很多語言和框架是跨平台的,但是沒有實現同樣的抽象層。使用 Java,你針對的是 JVM,而不是作業系統。對於程式設計師,當面對一些程式設計難題時,這是阻力最小的線路,但是它僅在當你知道如何程式設計 Java 時有用。如果你剛開始學習 Java 程式設計,這裡有你需要知道的七個基礎的提示。
但是,首先,如果你不確定是否你安裝了 Java ,你可以在一個終端(例如 Bash 或 PowerShell)中找出來,通過執行:
$ java --versionopenjdk 12.0.2 2019-07-16OpenJDK Runtime Environment 19.3 (build 12.0.2+9)OpenJDK 64-Bit Server VM 19.3 (build 12.0.2+9, mixed mode, sharing)
如果你得到一個錯誤,或未返回任何東西,那麼你應該安裝 Java 開發套件(JDK)來開始 Java 開發。或者,安裝一個 Java 執行時環境(JRE),如果你只是需要來執行 Java 應用程式。
在 Java 語言中,相關的類被分組到一個軟體包中。當你下載 JDK 時所獲得的 Java 基礎庫將被分組到以 java
或 javax
開頭的軟體包中。軟體包提供一種類似於計算機上的資料夾的功能:它們為相關的元素提供結構和定義(以程式設計術語說,名稱空間)。額外的軟體包可以從獨立開發者、開源專案和商業供應商獲得,就像可以為任何程式語言獲得庫一樣。
當你寫一個 Java 程式時,你應該在你的程式碼是頂部宣告一個軟體包名稱。如果你只是編寫一個簡單的應用程式來入門 Java,你的軟體包名稱可以簡單地用你的專案名稱。如果你正在使用一個 Java 整合式開發環境,如 Eclipse,當你啟動一個新的專案時,它為你生成一個合乎情理的軟體包名稱。
package helloworld;/** * @author seth * An application written in Java. */
除此之外,你可以通過查詢它相對於你的專案整體的路徑來確定你的軟體包名稱。例如,如果你正在寫一組類來幫助遊戲開發,並且該集合被稱為 jgamer
,那麼你可能在其中有一些唯一的類。
package jgamer.avatar;/** * @author seth * An imaginary game library. */
你的軟體包的頂層是 jgamer
,並且在其內部中每個軟體包都是一個獨立的派生物,例如 jgamer.avatar
和 jgamer.score
等等。在你的檔案系統裡,其目錄結構反映了這一點,jgamer
是包含檔案 avatar.java
和 score.java
的頂級目錄。
作為一名通曉多種語言的程式設計師,最大的樂趣是找出是否用 include
、import
、use
、require
,或一些其它術語來引入你不管使用何種程式語言編寫的庫。在 Java 中,順便說一句,當匯入你的程式碼的需要的庫時,使用 import
關鍵字。
package helloworld;import javax.swing.*;import java.awt.*;import java.awt.event.*;/** * @author seth * A GUI hello world. */
匯入是基於該環境的 Java 路徑。如果 Java 不知道 Java 庫儲存在系統上的何處,那麼,就不能成功匯入。只要一個庫被儲存在系統的 Java 路徑中,那麼匯入能夠成功,並且庫能夠被用於構建和執行一個 Java 應用程式。
如果一個庫並不在 Java 路徑中(因為,例如,你正在寫你自己的庫),那麼該庫可以與你的應用程式係結在一起(協定許可),以便匯入可以按預期地工作。
Java 類使用關鍵字 public class
宣告,以及一個唯一的對應於它的檔名的類名。例如,在專案 helloworld
中的一個檔案 Hello.java
中:
package helloworld;import javax.swing.*;import java.awt.*;import java.awt.event.*;/** * @author seth * A GUI hello world. */public class Hello { // this is an empty class}
你可以在一個類內部宣告變數和函數。在 Java 中,在一個類中的變數被稱為欄位。
Java 的方法本質上是物件中的函數。基於預期返回的資料型別(例如 void
、int
、float
等等),它們被定義為 public
(意味著它們可以被任何其它類存取)或 private
(限制它們的使用)。
public void helloPrompt(ActionEvent event) { String salutation = "Hello %s"; string helloMessage = "World"; message = String.format(salutation, helloMessage); JOptionPane.showMessageDialog(this, message); } private int someNumber (x) { return x*2; }
當直接呼叫一個方法時,以其類和方法名稱來參照。例如,Hello.someNumber
指向在 Hello
類中的 someNumber
方法。
Java 中的 static
關鍵字使程式碼中的成員可以獨立於包含其的物件而被存取。
在物件導向程式設計中,你編寫的程式碼用作“物件”的模板,這些物件在應用程式執行時產生。例如,你不需要編寫一個具體的視窗,而是編寫基於 Java 中的視窗類的視窗範例(並由你的程式碼修改)。由於在應用程式生成它的範例之前,你編寫的所有程式碼都不會“存在”,因此在建立它們所依賴的物件之前,大多數方法和變數(甚至是巢狀類)都無法使用。
然而,有時,在物件被通過應用程式建立前,你需要存取或使用其中的資料。(例如,除非事先知道球是紅色時,應用程式無法生成一個紅色的球)。對於這些情況,請使用 static
關鍵字。
Java 擅長捕捉錯誤,但是,只有你告訴它遇到錯誤時該做什麼,它才能優雅地恢復。在 Java 中,嘗試執行一個動作的級聯層次結構以 try
開頭,出現錯誤時回落到 catch
,並以 finally
結束。如果 try
子句失敗,則將呼叫 catch
,最後,不管結果如何,總是由 finally
來執行一些合理的動作。這裡是一個範例:
try { cmd = parser.parse(opt, args); if(cmd.hasOption("help")) { HelpFormatter helper = new HelpFormatter(); helper.printHelp("Hello <options>", opt); System.exit(0); } else { if(cmd.hasOption("shell") || cmd.hasOption("s")) { String target = cmd.getOptionValue("tgt"); } // else } // fi} catch (ParseException err) { System.out.println(err); System.exit(1); } //catch finally { new Hello().helloWorld(opt); } //finally} //try
這是一個健壯的系統,它試圖避免無法挽回的錯誤,或者,至少,為你提供讓使用者提交有用的反饋的選項。經常使用它,你的使用者將會感謝你!
Java 檔案,通常以 .java
結尾,理論上說,可以使用 java
命令執行。然而,如果一個應用程式很複雜,執行一個單個檔案是否會產生有意義的結果是另外一個問題。
來直接執行一個 .java
檔案:
$ java ./Hello.java
通常,Java 應用程式以 Java 存檔(JAR)檔案的形式分發,以 .jar
結尾。一個 JAR 檔案包含一個清單檔案(可以指定主類、專案結構的一些後設資料),以及執行應用程式所需的所有程式碼部分。
要執行一個 JAR 檔案,你可以雙擊它的圖示(取決於你的作業系統設定),你也可以從終端中啟動它:
$ java -jar ./Hello.jar
Java 是一種強大的語言,由於有了 OpenJDK 專案及其它的努力,它是一種開放式規範,允許像 IcedTea、Dalvik 和 Kotlin 專案的茁壯成長。學習 Java 是一種準備在各種行業中工作的好方法,而且,使用 Java 的理由很多。