Java 類別與物件 (Class & Object)

Java 是物件導向程式語言(Object-Oriented Programming, OOP)。類別是物件的藍圖,物件是類別的實例。

基本概念

  • 類別 (Class):物件的模板,定義屬性和方法
  • 物件 (Object):類別的實例
  • 屬性 (Attribute):物件的資料(變數)
  • 方法 (Method):物件的行為(函式)

定義類別

public class Dog {
    // 屬性(實例變數)
    String name;
    int age;
    
    // 方法
    public void bark() {
        System.out.println(name + " says: Woof!");
    }
}

建立物件

使用 new 關鍵字建立物件:

Dog myDog = new Dog();

// 設定屬性
myDog.name = "Buddy";
myDog.age = 3;

// 呼叫方法
myDog.bark();  // Buddy says: Woof!

建構子

建構子是建立物件時自動執行的特殊方法:

public class Dog {
    String name;
    int age;
    
    // 建構子
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public void bark() {
        System.out.println(name + " says: Woof!");
    }
}

// 使用建構子建立物件
Dog myDog = new Dog("Buddy", 3);
myDog.bark();  // Buddy says: Woof!

更多說明請參考 Java 建構子

this 關鍵字

this 指向當前物件:

public class Person {
    String name;
    
    public Person(String name) {
        this.name = name;  // this.name 是屬性,name 是參數
    }
    
    public void introduce() {
        System.out.println("I am " + this.name);
    }
}

更多說明請參考 Java this 關鍵字

完整範例

public class Car {
    // 屬性
    private String brand;
    private String model;
    private int year;
    private double speed;
    
    // 建構子
    public Car(String brand, String model, int year) {
        this.brand = brand;
        this.model = model;
        this.year = year;
        this.speed = 0;
    }
    
    // Getter 方法
    public String getBrand() {
        return brand;
    }
    
    public double getSpeed() {
        return speed;
    }
    
    // 行為方法
    public void accelerate(double amount) {
        speed += amount;
        System.out.println("加速到 " + speed + " km/h");
    }
    
    public void brake() {
        speed = 0;
        System.out.println("已停車");
    }
    
    public void displayInfo() {
        System.out.println(year + " " + brand + " " + model);
    }
}

// 使用
public class Main {
    public static void main(String[] args) {
        Car myCar = new Car("Toyota", "Camry", 2024);
        
        myCar.displayInfo();    // 2024 Toyota Camry
        myCar.accelerate(60);   // 加速到 60.0 km/h
        myCar.accelerate(40);   // 加速到 100.0 km/h
        myCar.brake();          // 已停車
    }
}

多個物件

每個物件有自己的屬性:

Car car1 = new Car("Toyota", "Camry", 2024);
Car car2 = new Car("Honda", "Civic", 2023);

car1.accelerate(50);  // car1 速度變成 50
car2.accelerate(30);  // car2 速度變成 30

// car1 和 car2 的速度是獨立的

物件作為參數

public class Garage {
    public void repair(Car car) {
        System.out.println("正在維修 " + car.getBrand());
    }
}

Garage garage = new Garage();
garage.repair(myCar);  // 正在維修 Toyota

物件作為回傳值

public class CarFactory {
    public Car createCar(String brand) {
        return new Car(brand, "Default", 2024);
    }
}

CarFactory factory = new CarFactory();
Car newCar = factory.createCar("BMW");

Object 類別

所有類別都繼承自 Object

public class Person {
    String name;
    
    @Override
    public String toString() {
        return "Person: " + name;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return Objects.equals(name, person.name);
    }
}

更多說明請參考 Java Object 類別

null 處理

Car car = null;  // 沒有指向任何物件

// car.accelerate(50);  // NullPointerException!

if (car != null) {
    car.accelerate(50);  // 安全的方式
}

類別 vs 物件

類別物件
藍圖/模板實例
抽象的概念具體的實體
只定義一次可建立多個
不佔記憶體(除了載入)佔用記憶體