CodeGym /課程 /JAVA 25 SELF /Java 程式的結構與 main 方法

Java 程式的結構與 main 方法

JAVA 25 SELF
等級 8 , 課堂 1
開放

1. 前言

剛開始學程式時,會覺得只要一行一行寫下去,一切就會動起來。但當程式一複雜,腦中就開始混亂:什麼東西在哪裡、為什麼要這樣寫,如果要改一行——那一行到底在哪?

因此,和多數現代語言一樣,Java 提供了一種把程式碼「整理上架」的方法,讓你隨時都能看懂程式在做什麼,並且快速找到需要的位置。

想像一間公司:有人資部、會計部、IT 部門、物流部等等。每個部門都有自己的職責、員工與任務。

Java 程式中,每個這樣的「部門」就是一個 類別。某個類別負責使用者,另一個負責運算,第三個負責檔案。

以下是簡單專案的典型結構:

  • Main.java — 總辦公室:這裡有「入口點」,一切從這裡開始。
  • User.java — 負責儲存與處理使用者資料的部門。
  • Calculator.java — 計算部門。
  • FileHelper.java — 檔案專家。

即使是很小的程式,通常也至少有一個類別。而大型專案就像由上百個類別組成的「摩天大樓」!

2. 類別——工具箱

Java 是一種 物件導向語言,其中的一切都是物件。物件的型別稱為 類別

類別就像一個箱子或櫃子,我們把需要的東西放進去:變數、方法。想像一個標著「鐵鎚」的箱子:裡面只放與鐵鎚相關的工具。

class Example 
{
    // 這裡放我們的工具:變數與方法
}

類別通常包含變數與函式。在 Java 中,類別的變數慣稱為 欄位,而類別的函式稱為 方法;但本質是一樣的。

還記得我們的第一段程式碼嗎?

System.out.println("大家好!");

在這段程式碼中,同時出現了類別與方法:

  • System —— 提供與系統互動方法的類別。
  • out —— 一個欄位,是 PrintStream 類別的物件。
  • println —— PrintStream 類別的方法,用來把文字輸出到螢幕。

從某種意義上說,程式設計就是撰寫自己的類別與方法,並去呼叫其他類別的方法。

3. main() 方法的簡寫

其實,最小的 Java 程式看起來像這樣:

class Program 
{
    public static void main(String[] args) 
    {
        // 在這裡寫你的程式碼
    }
}

它至少包含一個類別,且其中必須有一個 main 方法,簽章(signature)如下:


public static void main(String[] args)
Java 中 main 方法的簽章

不過在 Java 21 中,可以用簡寫的方式撰寫 main()。在編譯時,Java 編譯器會把它轉換成正規的 main() 方法。

因此,每當你寫出像這樣的程式碼:

void main() 
{
    Scanner console = new Scanner(System.in);
    int age = console.nextInt();
    System.out.println("年齡:" + age);
}

Java 編譯器會把它轉換成下面的程式碼:

class Program 
{
    public static void main(String[] args) 
    {
        Scanner console = new Scanner(System.in);
        int age = console.nextInt();
        System.out.println("年齡:" + age);
    }
}

4. 典型的 Java 類別

典型的 Java 類別大概長這樣:

public class MathUtils 
{
    // 靜態變數(對整個類別而言是全域的)
    static final double PI = 3.14159;
    static int callCounter = 0;

    // 靜態方法:計算圓面積
    public static double circleArea(double radius) 
    {
        callCounter++;
        return PI * radius * radius;
    }

    // 靜態方法:找出兩數中的最大值
    public static int max(int a, int b) 
    {
        callCounter++;
        return (a > b) ? a : b;
    }

    // 靜態方法:統計方法被呼叫了幾次
    public static int getCallCount() 
    {
        return callCounter;
    }

    // 在 main() 方法中存取欄位與方法 
    public static void main(String[] args) 
    {
        System.out.println("圓的面積:" + circleArea(5));
        System.out.println("最大值:" + max(10, 42));
        System.out.println("方法被呼叫了 " + getCallCount() + " 次");
    }
}

我們在這裡可以看到:

  • 一個類別可以有很多方法。
  • 類別可以擁有自己的變數。
  • 類別的方法可以彼此呼叫。
  • 類別的方法可以存取共同的變數。
  • 每個方法前面都有相同的「魔法字」例如:public static
  • 每個方法前面還會有不同的型別:intdoublevoid

下面我們會一一說明這些重點。

5. 類別的欄位(變數)——它的記憶

在類別內可以保存變數,通常稱為 欄位(fields)。它們就像記憶體的格子,用來存放資料。

public class MathUtils 
{
    // 靜態變數(對整個類別而言是全域的)
    static final double PI = 3.14159;
    static int callCounter = 0;
}    

欄位讓類別能在不同方法呼叫之間記住一些東西。例如,統計按鈕被按了幾次,或某個方法(callCounter)被呼叫了多少次。欄位的數量不限。

6. 方法——類別可以執行的動作

方法就是類別的「技能」。如果把類別比作員工,方法就是他的技能:能做哪些事。

例如,方法可以:

  • 把某些內容輸出到螢幕,
  • 計算兩個數的總和,
  • 接收輸入資料並回傳結果。

方法的結構:

  1. 回傳值型別(例如,void 表示不回傳任何東西,或 int 表示回傳整數)。
  2. 方法名稱(例如,circleArea)。
  3. 括號中的參數(可以沒有)。
  4. 大括號 { ... } —— 方法本體。
public class MathUtils 
{
    // 靜態方法:計算圓面積
    public static double circleArea(double radius) 
    {
        callCounter++;
        return PI * radius * radius;
    }

    // 靜態方法:找出兩數中的最大值
    public static int max(int a, int b) 
    {
        callCounter++;
        return (a > b) ? a : b;
    }
}    

關於方法與相關細節,你會在接下來的課程中學到更多。

7. 存取修飾詞

Java 中,你可以決定類別的哪些部分可被其他類別存取,哪些只留作內部使用。為此要用到 存取修飾詞

  • public —— 對所有人可見。這樣的方法與欄位可以在程式的任何地方使用或呼叫。
  • private —— 只有類別本身可見。這些是內部細節,不應讓外界存取;就好像它們根本不存在一樣。
public class MathUtils 
{
    // 靜態變數(對整個類別而言是全域的)
    private static final double PI = 3.14159;
    private static int callCounter = 0;

    // 靜態方法:計算圓面積
    public static double circleArea(double radius) 
    {
        callCounter++;
        return PI * radius * radius;
    }
}    

黃金法則:通常會把欄位設為 private,只把需要對外使用的方法public 暴露出來。關於可見性的更多內容,會在後續課程中介紹。

8. 靜態方法與變數

一般來說,在 Java 中,類別會作為建立物件的樣板。你寫好類別,接著用關鍵字 new 建立該類別的物件,然後對物件呼叫方法。

不過還有第二種用法:把類別當作全域變數與方法的容器,可以在程式的任何地方呼叫。這正是關鍵字 static 的用途。它告訴 Java 編譯器,方法與欄位不是繫結在物件上,而是繫結在類別本身,因此不必建立物件就能呼叫它們。

順帶一提,你其實一直在使用這類方法:

Integer.parseInt();     // Integer 類別的靜態方法 parseInt()
String.valueOf();       // String 類別的靜態方法 valueOf() 
Double.isInfinite();    // Double 類別的靜態方法 isInfinite() 
Arrays.copy();          // Arrays 類別的靜態方法 copy() 

main() 方法一定宣告為靜態,因為你的 Java 程式就是從它開始執行的,在建立任何物件之前。

9. 在 IDEA 中的小技巧

main() 方法的完整簽章如下:

public static void main(String[] args) 

為了避免每次都手動輸入,在 IntelliJ IDEA 中有快捷鍵。只要輸入 psvm 然後按下 Tab,IntelliJ IDEA 就會幫你產生以下程式碼:

public static void main(String[] args) 
{
    
}

很好記——psvmpublic static void main 的字首縮寫。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION