物件導向設計(Java)

目錄

甚麼是物件導向設計

物件導向設計(Object-Oriented Design, OOD)是一種軟體設計方法,它將軟體系統中的元素組織為物件(Object)。物件是一個具有屬性(Attributes)和行為(Methods)的實體(instance)。物件導向設計的目標是將複雜的系統分解為簡單的物件,並通過它們之間的協作來實現系統的功能。

在 Java 中,物件(Object)與實例(Instance)是差不多的概念,通常我們會將一個類(Class)實例化(Instantiate)為一個物件(Object)。

物件導向設計的基本原則

物件導向設計的基本原則包括以下幾點:

  1. 封裝(Encapsulation) 封裝是一種將屬性(Attributes)和方法(Methods)封裝在一個物件(Object)中的機制。封裝可以保護物件的內部狀態,並提供一個清晰的界面,使物件之間的協作更容易。
  2. 繼承(Inheritance) 繼承是指一個物件(Object)可以繼承另一個物件的屬性(Attributes)和方法(Methods)。繼承可以提高代碼的重用性,並使代碼更容易擴展和修改。
  3. 多型(Polymorphism) 多型是指一個物件(Object)可以根據上下文的不同表現出不同的行為。多型可以提高代碼的靈活性,並使代碼更容易理解和維護。

用 Code 來說明物件導向設計的基本原則

封裝(Encapsulation)

封裝是一種將屬性(Attributes)和方法(Methods)封裝在一個物件(Object)中的機制。使這些屬性和方法只能通過物件的界面來訪問,而不能直接訪問。

// 定義一個類別(Class)
public class Person {
    // 定義屬性(Attributes)
    private String name;
    private int age;

    // 定義方法(Methods),這個方法我們也稱之為建構子(Constructor)
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 定義方法(Methods)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

繼承(Inheritance)

我們先定義了一個父類別(Parent Class),然後定義了一個子類別(Child Class or Subclass),子類別繼承了父類別的屬性(Attributes)和方法(Methods)。 也就是說我們利用繼承的機制,可以將父類別的屬性(Attributes)和方法(Methods)重用在子類別中。 Dog 與 Cat 都是 Animal,狗會吠叫,貓會喵喵叫,且它們同時都會吃東西。這麼一來,我們就可以將吃東西的方法放在父類別中,然後讓子類別繼承父類別的方法,就可以達到代碼重用的目的,減少重複代碼的情況。

// 定義一個父類別(Parent Class)
public class Animal {
    public void eat() {
        System.out.println("Animal is eating...");
    }
}

// 定義一個子類別(Child Class or Subclass)
public class Dog extends Animal {
    public void bark() {
        System.out.println("Dog is barking...");
    }
}

// 定義一個子類別(Child Class or Subclass)
public class Cat extends Animal {
    public void meow() {
        System.out.println("Cat is meowing...");
    }
}

多型(Polymorphism)

延續上面的例子,我們可以看到 Dog 與 Cat 都是 Animal,所以我們可以將 Dog 與 Cat 都當作 Animal 來使用。 值白一點的說法就是我們可以使用父類別(Parent Class)的引用來引用子類別(Child Class or Subclass)的物件(Object)。 這個物件就可以使用多種型別來表示,這就是多型(Polymorphism)的概念。

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();

        dog.eat(); // Output: Animal is eating...
        cat.eat(); // Output: Animal is eating...

        // dog.bark(); // Error: Cannot resolve method 'bark' in 'Animal'
        // cat.meow(); // Error: Cannot resolve method 'meow' in 'Animal'
    }
}