1. 類別的欄位:物件狀態存在哪裡
欄位是宣告在類別內部、但在所有方法之外的變數。欄位負責讓每個物件擁有自己的「狀態」。例如,如果我們有一個 Person 類別,欄位可以是:
- name — 人的名字
- age — 年齡
- balance — 帳戶餘額(如果我們正在做銀行應用程式)
- isStudent — 布林旗標,表示此人是否為學生
欄位宣告語法
欄位的宣告類似一般變數,只是它不是在方法內,而是直接寫在類別裡:
public class Person {
String name;
int age;
}
這裡我們宣告了兩個欄位:字串 name 和整數 age。每個欄位都屬於此類別的某個具體物件。也就是說,不同物件會有各自的值。比如:
Person p1 = new Person();
p1.name = "Olya";
p1.age = 20;
Person p2 = new Person();
p2.name = "Igor";
p2.age = 25;
第一個物件的名字是「Olya」,年齡是 20;第二個是「Igor」,年齡是 25。它們都來自同一個類別,但各自的欄位存著不同資料。
存取修飾詞(public/private)
欄位可以是開放的(public)或封閉的(private)。在現實生活中,你不會對所有人都公開你的銀行餘額,對吧?在程式設計中也常把欄位設為 private,以避免從其他類別直接存取。這是封裝(encapsulation)的一部分(詳細內容將在後續課程介紹)。
範例:
public class Person {
private String name;
private int age;
}
先不把事情複雜化,但請記住:如果欄位是 private,就不能從其他類別直接存取它。
2. 類別的方法:物件如何「行動」
方法是描述物件行為的函式。方法讓物件能做事情:說話、計算、奔跑、跳躍、輸出自身資訊,等等。
方法宣告語法
tip_vozvrashchaemogo_znacheniya imyaMetoda(parametry) {
// 方法主體
}
範例:會說「嗨」的方法:
public void sayHello() {
System.out.println("嗨!我叫 " + name);
}
這裡:
- public — 存取修飾詞。
- void — 方法不傳回任何值(只是執行某件事)。
- sayHello — 方法名稱。
- 在方法內我們使用欄位 name 來向使用者問好。
另一個範例:傳回年齡的方法
public int getAge() {
return age;
}
方法可以傳回值(int、String 等),也可以「不傳回任何東西」—— 那就寫 void。
3. 建構子:物件如何「誕生」
建構子是一種在建立新物件時會被呼叫的特殊方法。它的任務是用初始值來初始化物件的欄位,也就是把物件的「空口袋」填上具體資料。例如,一開始就替人設定名字與年齡,而不是讓它們保持空白。
- 建構子的名稱永遠與類別名稱相同。
- 建構子沒有傳回型別(甚至不寫 void)。
- 建構子可以接受參數(例如名字與年齡),也可以沒有參數。
建構子範例
public class Person {
String name;
int age;
// 具有兩個參數的建構子
public Person(String name, int age) {
this.name = name; // this.name 是物件欄位,name 是建構子的參數
this.age = age;
}
}
你也許會好奇 this 是什麼。其實,關鍵字 this 是「從內部」指向目前物件的參照。我們用它來區分同名的欄位與參數。如果沒有 this,編譯器會搞不清楚我們到底要初始化哪一個。
預設建構子
如果你沒有宣告任何建構子,Java 編譯器會自動加入一個沒有參數的空建構子。它長這樣:
public Person() {
// 什麼也不做,但允許建立無參數的物件
}
但請注意! 如果你已經宣告了任一自訂建構子(例如帶參數的),預設建構子就不會自動產生!如果你需要它——請明確寫出來。
4. 完整類別範例
讓我們把所有內容組合起來:欄位、方法、建構子。
public class Person {
String name;
int age;
// 建構子
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 方法:打招呼
public void sayHello() {
System.out.println("嗨!我叫 " + name + ",我 " + age + " 歲。");
}
// 方法:年齡加 1
public void haveBirthday() {
age = age + 1;
System.out.println("太好了!我現在 " + age + " 歲!");
}
}
如何在程式中使用?
public class Main {
public static void main(String[] args) {
Person vasya = new Person("Vasya", 18);
vasya.sayHello(); // 嗨!我叫 Vasya,我 18 歲。
vasya.haveBirthday(); // 太好了!我現在 19 歲!
}
}
5. 實作:擴充你的應用程式
假設你正在做一個簡單的使用者管理應用程式。前幾次課程我們只在 main 中操作變數與方法。現在建立你自己的 User 類別,包含欄位、方法與建構子。
public class User {
String username;
int score;
// 建構子
public User(String username, int score) {
this.username = username;
this.score = score;
}
// 方法:輸出使用者資訊
public void printInfo() {
System.out.println("使用者名稱: " + username + ",分數: " + score);
}
// 方法:增加分數
public void addScore(int points) {
score += points;
System.out.println(username + " 獲得了 " + points + " 分!現在他有 " + score + " 分。");
}
}
使用方式:
public class Main {
public static void main(String[] args) {
User alice = new User("Alice", 10);
User bob = new User("Bob", 5);
alice.printInfo(); // 使用者名稱: Alice,分數: 10
bob.printInfo(); // 使用者名稱: Bob,分數: 5
alice.addScore(7); // Alice 獲得了 7 分!現在他有 17 分。
bob.addScore(3); // Bob 獲得了 3 分!現在他有 8 分。
}
}
請注意:每個物件都有自己的欄位,一個物件的變更不會影響到另一個。
6. 存取修飾詞簡述
在我們的例子中,欄位是開放的(String name;)。實務上常把欄位設為 private,以避免從其他類別不小心(或刻意)修改它們。詳細內容會在封裝這個主題中說明,先看個例子:
public class User {
private String username;
private int score;
public User(String username, int score) {
this.username = username;
this.score = score;
}
public void printInfo() {
System.out.println("使用者名稱: " + username + ",分數: " + score);
}
public void addScore(int points) {
score += points;
}
}
現在如果有人嘗試在類別之外寫 alice.score = 100500; —— 編譯器會說「不可以!」。
7. 使用欄位、方法與建構子時的常見錯誤
錯誤 №1:未初始化的欄位。
如果你沒有替欄位指定值,它們會拿到預設值:數字是 0,boolean 是 false,參考(例如 String)是 null。若忘了初始化欄位,可能得到意外結果,甚至在嘗試對它做某些操作時拋出 NullPointerException。
錯誤 №2:混淆參數與欄位。
在建構子裡,新手常寫成 name = name; —— 這並沒有初始化欄位,只是把參數賦值給自己。請務必使用 this.name = name!
錯誤 №3:缺少預設建構子。
如果你宣告了帶參數的建構子,卻忘了另外明確加上空建構子,那麼 new Person() 就不能使用。
錯誤 №4:方法與類別同名。
在 Java 中,建構子的名稱必須與類別名相同,而方法則不需要。有時會誤把方法命名成和類別相同,編譯器就會報錯。
錯誤 №5:忽略存取修飾詞。
如果讓欄位是 public,就能在任何地方修改它們——對大型程式來說很危險。最好一開始就習慣使用 private,並用方法來存取。
GO TO FULL VERSION