CodeGym /課程 /JAVA 25 SELF /使用 new 建立物件

使用 new 建立物件

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

1. 關鍵字 new

在 Java 中,要建立任何類別的物件,會使用關鍵字 new。這個「神奇的」關鍵字會請 JVM:為新的物件配置記憶體,並為它呼叫建構子。

類比:
如果類別是汽車的藍圖,那麼 new 就是依照藍圖組裝實體車子的工廠。

範例

Person vasya = new Person();

這裡發生了什麼:

  1. new Person() — 建立一個 Person 類型的新物件(呼叫建構子)。
  2. vasya — 用來保存所建立之物件參考的變數。

記憶體中是怎麼運作的

當你寫下 Person vasya = new Person(); 時,記憶體中會配置一塊區域給物件的欄位(例如姓名與年齡),而變數 vasya 則保存該區域的位址—也就是參考。

注意:
如果忘了寫 new,變數只會是一個不指向任何東西的參考(null)。嘗試把這個「空」物件當成真正物件去取用欄位或方法,會導致 NullPointerException

2. 呼叫建構子:怎麼運作?

建構子是建立物件時會被呼叫的特殊方法,用來初始化它的欄位,讓實例可投入使用。

語法

ImyaKlassa imyaPeremennoy = new ImyaKlassa(argumenty);
  • 如果類別有帶參數的建構子,就必須傳入那些參數。
  • 如果是無參數(或預設)建構子,括號保持為空即可。

範例:帶參數的建構子

public class Person {
    String name;
    int age;

    // 帶參數的建構子
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

建立物件:

Person petya = new Person("Petya", 25);

"Petya"25 會被填入新物件的 nameage 欄位。

不帶參數的建構子

public Person() {
    this.name = "未命名";
    this.age = 0;
}

現在就可以這樣寫:

Person mysteryMan = new Person(); // name="未命名", age=0

3. 使用物件:欄位與方法

建立物件後,你可以透過點運算子(.)存取它的欄位與方法:

petya.name = "Pyotr";
System.out.println(petya.name); // Pyotr

petya.sayHello();

如果類別裡有方法:

public void sayHello() {
    System.out.println("你好,我叫 " + name + "!");
}

那麼呼叫 petya.sayHello(); 會輸出:你好,我叫 Pyotr!

範例:完整類別

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 + "!");
    }
}

使用方式:

Person vasya = new Person("Vasya", 30);
vasya.sayHello(); // 你好,我叫 Vasya!

4. 參考型別變數:是什麼?

在 Java 中,類別型別的變數是參考到記憶體中的物件,而不是物件本身。

示範

Person vasya = new Person("Vasya", 30);
Person anotherVasya = vasya;

現在 vasyaanotherVasya 都指向記憶體中的同一個物件。若透過其中一個變數修改欄位,另一個也會改變:

anotherVasya.age = 31;
System.out.println(vasya.age); // 31

重點:
如果建立兩個不同的物件,它們彼此獨立:

Person petya = new Person("Petya", 25);
Person masha = new Person("Masha", 22);

petya.age = 99;
System.out.println(masha.age); // 22(未改變!)

5. 範例:建立並使用多個物件

在應用程式中加入幾個物件。假設我們有一個 Person 類別,並在 main 中建立幾位人物並輸出他們的問候語。

Person 類別

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 + " 歲!");
    }
}

在 main 中使用

public class Main {
    public static void main(String[] args) {
        Person vasya = new Person("Vasya", 25);
        Person petya = new Person("Petya", 27);

        vasya.sayHello(); // 你好,我叫 Vasya,我 25 歲!
        petya.sayHello(); // 你好,我叫 Petya,我 27 歲!

        // 展示物件的獨立性:
        vasya.age = 100;
        vasya.sayHello(); // 你好,我叫 Vasya,我 100 歲!
        petya.sayHello(); // 你好,我叫 Petya,我 27 歲!
    }
}

程式輸出:

你好,我叫 Vasya,我 25 歲!
你好,我叫 Petya,我 27 歲!
你好,我叫 Vasya,我 100 歲!
你好,我叫 Petya,我 27 歲!

6. 建立物件時的常見錯誤

錯誤一:忘了寫 new

Person vasya;
vasya.name = "Vasya"; // NullPointerException!

變數 vasya 沒有參考到任何物件(null)。必須使用 new 來建立物件。

錯誤二:沒有把參數傳給建構子

Person petya = new Person(); // 若沒有無參數建構子,這會編譯失敗

如果類別只有帶參數的建構子,那麼建立物件時就一定要提供那些參數。

錯誤三:以為變數存的是物件本身

Person a = new Person("Anya", 20);
Person b = a;
b.age = 99;
System.out.println(a.age); // 99,因為 a 和 b 是指向同一個物件的參考!

在 Java 中,類別型別的變數永遠是參考,而不是物件本身。

錯誤四:修改某個物件的欄位,卻期待另一個不會變

Person x = new Person("X", 1);
Person y = x;
x.age = 42;
System.out.println(y.age); // 42

如果需要兩個彼此獨立的物件,就請分別建立它們!

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