# Java物件導向程式設計完整指南
物件導向程式設計(Object-Oriented Programming, OOP)是現代軟體開發的核心概念之一。Java作為純物件導向語言,完美地體現了OOP的各種特性。
## 1. 什麼是物件導向?
物件導向是一種程式設計思維,它將現實世界中的事物抽象為物件,每個物件都有自己的屬性(資料)和方法(行為)。
### 核心概念:
- **類別(Class)**:物件的藍圖或模板
- **物件(Object)**:類別的實例
- **屬性(Attribute)**:物件的資料
- **方法(Method)**:物件的行為
## 2. 封裝(Encapsulation)
封裝是將資料和操作資料的方法綁定在一起,並隱藏內部實作細節的原則。
java
public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
if (name != null && !name.trim().isEmpty()) {
this.name = name;
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 0 && age < 150) {
this.age = age;
}
}
}
## 3. 繼承(Inheritance)
繼承允許新類別基於現有類別建立,子類別可以繼承父類別的屬性和方法。
java
public class Person {
protected String name;
protected int age;
public void introduce() {
System.out.println("我是 " + name + ",今年 " + age + " 歲");
}
}
public class Student extends Person {
private String studentId;
private String major;
@Override
public void introduce() {
System.out.println("我是學生 " + name + ",學號:" + studentId);
}
public void study() {
System.out.println(name + " 正在學習 " + major);
}
}
## 4. 多型(Polymorphism)
多型允許同一個介面表示不同的底層資料型態,提供了程式的靈活性。
java
public abstract class Animal {
public abstract void makeSound();
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("汪汪!");
}
}
public class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("喵喵!");
}
}
// 使用多型
Animal[] animals = {new Dog(), new Cat()};
for (Animal animal : animals) {
animal.makeSound(); // 根據實際型態調用對應方法
}
## 5. 抽象(Abstraction)
抽象是隱藏複雜實作細節,只暴露必要功能的過程。
java
public interface Drawable {
void draw();
void setColor(String color);
}
public class Circle implements Drawable {
private String color;
private int radius;
@Override
public void draw() {
System.out.println("繪製一個" + color + "的圓形,半徑:" + radius);
}
@Override
public void setColor(String color) {
this.color = color;
}
}
## 6. 實際應用範例
讓我們建立一個簡單的銀行帳戶系統來展示所有OOP概念:
java
public abstract class BankAccount {
protected String accountNumber;
protected double balance;
protected String ownerName;
public BankAccount(String accountNumber, String ownerName) {
this.accountNumber = accountNumber;
this.ownerName = ownerName;
this.balance = 0.0;
}
public abstract void withdraw(double amount);
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
System.out.println("存款成功,餘額:" + balance);
}
}
public double getBalance() {
return balance;
}
}
public class SavingsAccount extends BankAccount {
private double interestRate;
public SavingsAccount(String accountNumber, String ownerName, double interestRate) {
super(accountNumber, ownerName);
this.interestRate = interestRate;
}
@Override
public void withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
System.out.println("提款成功,餘額:" + balance);
} else {
System.out.println("餘額不足或金額無效");
}
}
public void addInterest() {
balance += balance * interestRate;
System.out.println("利息已添加,新餘額:" + balance);
}
}
## 總結
物件導向程式設計提供了:
1. **程式碼重用性**:透過繼承和組合
2. **維護性**:封裝使程式碼更容易維護
3. **擴展性**:多型和抽象提供靈活的設計
4. **可讀性**:模擬現實世界的概念
掌握這些概念對於成為優秀的Java程式設計師至關重要。建議多寫程式碼實作,深化理解。