位元詩人 [Java] 程式設計教學:基本概念

Java
Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

本文介紹 Java 程式的基本概念,並開始撰寫第一個 Java 程式。

Java 程式碼的檔案名稱和副檔名

Java 原始碼的副檔名為 .java 。編譯出來的位元碼 (bytecode) 的副檔名為 .class 。將 Java 原始碼及位元碼打包起來的壓縮檔的副檔名為 .jar

Java 特別之處在於檔案名稱及主函式所在的類別名稱要一致。詳見下文。

撰寫第一個 Java 程式

用編輯器建立名稱為 MainProgram.java (名稱需固定) 的文字檔,輸入以下程式碼:

/* MainProgram.java */
public class MainProgram
{
    public static void main (String[] args) {}
}

這是一個最簡單的 Java 程式。這個程式什麼事都沒做。

注意此處的類別名稱 MainProgram 和檔案名稱 MainProgram.java 兩者間需保持一致。這是 Java 刻意設計的。若改了類別名稱,檔案名稱也要做相對應的修改。

稍微修改一下前一個例子,並加入一些說明文字:

/* A driver class. */
public class MainProgram
{
    /* The main function of the driver class */
    public static void main (String[] args)
    {
        /* Print out some message to stdout */
        System.out.println("Hello World");
    }
}

Java 的主函式 (main function) 要包在類別 (class) 中。這個的類別稱為 driver class。這是因為 Java 從一開始就強調物件導向範式。

這裡只有一行指令:

System.out.println("Hello World");

這裡用到一點物件導向程式的概念。呼叫類別 System 的屬性 (property) out 所帶的方法 (method) println。呼叫該方法時傳入的參數 (argument) 為 "Hello World"

寫完範例程式後。來看編譯及執行 Java 程式碼的方式。詳見下文。

編譯和執行 Java 程式碼

先使用 javac (Java 編譯器) 編譯 Java 原始碼:

$ javac MainProgram.java

這時候 Java 原始碼會編譯成位元碼 (bytecode)。

再用 java (Java 執行器) 執行 Java 位元碼:

$ java MainProgram
Hello World

執行 Java 程式時,不需要加上副檔名。

省略 Driver Class 的 Java 程式碼

由於 driver class 只是一些制式的程式碼,對於理解 Java 程式沒有幫助。有些 Java 教材會在非必要的時候省略 driver class 的部分。像是以下的例子:

double principal = 10000;
double total = principal * Math.pow(1.0 + 0.05, 10);

跟放在 driver class 裡面是相同的:

public class MainProgram
{
    public static void main (String[] args)
    {
        double principal = 10000;
        double total = principal * Math.pow(1.0 + 0.05, 10);
    }
}

歐美的 Java 教材比較會採用這種簡略的寫法,閱讀一陣子就會習慣。我們也會在情境適合時用這種寫法來節省篇幅。

位元碼 (Bytecode)

傳統的編譯語言 (compiled language) C、C++、Pascal 的編譯器 (compiler) 會將程式碼編譯成特定平台的機械碼。但 Java 的編譯器將 Java 程式碼編譯成位元碼。接著使用 Java 虛擬機器執行位元碼。

從技術細節來說,Java 並非真正的跨平台語言,而是針對每個平台 (CPU 及作業系統) 重新實作相對應的 Java 虛擬機器。Java 程式的使用者真正做的事是把同一份位元碼拿到不同 Java 虛擬機器上重新執行。

大小寫敏感性 (Case Sensitivity)

Java 具有大小寫敏感性。像是 fooFooFOO 視為相異的識別字 (identifier)。識別字可能是變數、函式、類別的名稱。但程式設計者不應濫用這樣的特性。

空白 (Space)、縮進 (Indentation)、換行 (Newline)

Java 對於空白、縮進、換行等排版元素相對自由。除了要用空白隔開程式碼外,其餘的版面安排相對自由。一般來說,撰寫 Java 程式時,會一併排列程式碼,以利於日後維護。

註解 (Comment)

在程式碼中,註解用來加上非程式碼文字。編譯器會自動忽略註解的內容。承襲 C 家族的慣例,Java 的註解有兩種形式:

  • 多行註解:使用一對 /**/ 包覆起來的文字 (來自 C)
  • 單行註解:在 // 後的文字,延伸至同一行的行尾 (來自 C++)

套件 (Package)

這裡的套件不是程式語言的套件,而是程式的命名空間 (namespace)。套件用來區隔類別名稱。理論上在不同套件中可以使用相同的類別名稱,實務上不會刻意使用相同的類別名稱。

先前提到的類別 System 就是位於套件 java.lang 中。所以,將前述指令完整寫出如下:

java.lang.System.out.println("Hello World");

實際上,我們不需要這樣寫。這和 Java 引入函式庫的機制相關。詳見下文。

引入函式庫

除了使用 Java 語法撰寫程式碼外,程式設計者需要使用函式庫 (library) 來擴充 Java 的功能。由於 Java 是物件導向語言,有時候會用物件庫來稱呼 Java 的函式庫。

程式語言內建的函式庫稱為標準函式庫 (standard library)。需要另行安裝的則稱為第三方函式庫 (third-party library) 或社群函式庫。由於標準函式庫和語言本身一同維護,應優先使用。

Java 引用函式庫的語法是 import。以下指令引用 System

import java.lang.System;

以下指令則引用 java.lang 套件內所有的類別:

import java.lang.*;

這樣的指令其實是不必要的。每個 Java 程式皆會自動引用 java.lang 內的所有類別。其他的物件庫則是隨需要才引入,這樣的目的是節約讀取物件庫的時間。

標準物件庫是隨 Java 平台發佈的,需要時直接引用即可。第三方物件庫則需另行安裝。在學習語法的階段,暫時不需要使用第三方物件庫,故這裡不說明新增物件庫的方式。

主函式 (Main Function)

主函式是 Java 應用程式的進入點 (entry)。每個程式只有一個進入點。承襲 C 家族語言的慣例,Java 的主函式固定稱為 main。不需要為 Java 主函式傳回傳值 (return value)。

由於 Java 刻意使用物件導向範式,Java 的函式會包在類別中,可得主函式的程式碼如下:

public class MainProgram
{
    public static void main (String[] args)
    {
        /* Implement your code here. */
    }
}

前文提過,主函式所在的類別名稱可以自由設置,但要和檔案名稱保持一致。

表達式 (Expression) 和敘述 (Statement)

表達式和敘述是程式設計的基本概念。表達式會回傳值而敘述用來指示某項指令。Java 承襲 C 家族語言的慣例,以敘述為程式碼的基本單位。

離開狀態 (Exit Status)

Java 主函式的回傳型態為 void,代表不需向系統傳回傳值。這是因為命令列軟體並非 Java 程式的主要應用範圍。若需要傳回傳值,可使用 System.exit() 函式。

Java 專案 (Project)

原本 Java 沒有專案的概念,Java 社群開發出數種專案管理軟體,常見的有 Ant、Maven、Gradle。此外,一些 IDE 附帶專案管理的功能。

在學習階段,直接用 IDE 管理 Java 專案無妨,因為這時沒有多人協作的議題。長期來說,使用 Gradle 這類跨平台且 IDE 中立的專案管理工具較佳。

關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。