物件導向設計(Java)
目錄
甚麼是物件導向設計
物件導向設計(Object-Oriented Design, OOD)是一種軟體設計方法,它將軟體系統中的元素組織為物件(Object)。物件是一個具有屬性(Attributes)和行為(Methods)的實體(instance)。物件導向設計的目標是將複雜的系統分解為簡單的物件,並通過它們之間的協作來實現系統的功能。
在 Java 中,物件(Object)與實例(Instance)是差不多的概念,通常我們會將一個類(Class)實例化(Instantiate)為一個物件(Object)。
物件導向設計的基本原則
物件導向設計的基本原則包括以下幾點:
- 封裝(Encapsulation) 封裝是一種將屬性(Attributes)和方法(Methods)封裝在一個物件(Object)中的機制。封裝可以保護物件的內部狀態,並提供一個清晰的界面,使物件之間的協作更容易。
- 繼承(Inheritance) 繼承是指一個物件(Object)可以繼承另一個物件的屬性(Attributes)和方法(Methods)。繼承可以提高代碼的重用性,並使代碼更容易擴展和修改。
- 多型(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'
}
}