CodeGym /課程 /JAVA 25 SELF /類別結構:欄位、方法、建構子

類別結構:欄位、方法、建構子

JAVA 25 SELF
等級 14, 課堂 2
開放

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,並用方法來存取。

1
任務
JAVA 25 SELF, 等級 14, 課堂 2
上鎖
虛擬展示窗的夢想汽車
虛擬展示窗的夢想汽車
1
任務
JAVA 25 SELF, 等級 14, 課堂 2
上鎖
快速註冊新學生
快速註冊新學生
1
任務
JAVA 25 SELF, 等級 14, 課堂 2
上鎖
數位事件計數器
數位事件計數器
1
任務
JAVA 25 SELF, 等級 14, 課堂 2
上鎖
銀行帳戶管理
銀行帳戶管理
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION