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)
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。
- 每個方法前面還會有不同的型別:int、double、void。
下面我們會一一說明這些重點。
5. 類別的欄位(變數)——它的記憶
在類別內可以保存變數,通常稱為 欄位(fields)。它們就像記憶體的格子,用來存放資料。
public class MathUtils
{
// 靜態變數(對整個類別而言是全域的)
static final double PI = 3.14159;
static int callCounter = 0;
}
欄位讓類別能在不同方法呼叫之間記住一些東西。例如,統計按鈕被按了幾次,或某個方法(callCounter)被呼叫了多少次。欄位的數量不限。
6. 方法——類別可以執行的動作
方法就是類別的「技能」。如果把類別比作員工,方法就是他的技能:能做哪些事。
例如,方法可以:
- 把某些內容輸出到螢幕,
- 計算兩個數的總和,
- 接收輸入資料並回傳結果。
方法的結構:
- 回傳值型別(例如,void 表示不回傳任何東西,或 int 表示回傳整數)。
- 方法名稱(例如,circleArea)。
- 括號中的參數(可以沒有)。
- 大括號 { ... } —— 方法本體。
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)
{
}
很好記——psvm 是 public static void main 的字首縮寫。
GO TO FULL VERSION