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