JAVA OOP - Interface , Abstract , Encapsulation , Inheritance And Polymorphism Concepts Code Example
Interface
Account:
Abstract And Encapsulation
BankAccount > Abstract , Encapsulation
-
abstract class BankAccount implements Account Override the Interface methods, and implement it
-
使用private modify 保護重要信息, 並通過getter setter 來更新和獲取數據
-
使用abstract寫了利息和手續費的計算方式, 供後續的子class 實現具體的功能
Inheritance And Polymorphism
SavingsAccount
-
Inheritance from BankAccount(Extends from BankAccount), 繼承
BankAccount 的所有屬性和方法
-
利用polymorphism 的特性, 複寫(Override) 利息和手續費的計算方式
剩餘的 checkAccountclass, TermAccount class 同樣採用了 Inheritance 和 Polymorphism 的特性
Code Example:
Interface
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | // ============================================
// 第一部分:定義介面 - 帳戶的基本能力
// ============================================
/**
* 介面:定義所有帳戶必須具備的功能
* Interface - 規定帳戶應該做什麼
*/
interface Account {
void deposit(double amount); // deposit
void withdraw(double amount); // withdraw
double getBalance(); // balance check
void printStatement(); // print
}
|
Abstract And Encapsulation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110 | // ============================================
// 第二部分:抽象類別 - 帳戶的通用邏輯
// ============================================
/**
* 抽象類別:所有帳戶的基礎框架
* Abstract - 提供共同的方法和屬性
* Encapsulation - 使用private保護敏感數據
*/
abstract class BankAccount implements Account {
// === Encapsulation 封裝 ===
// 使用private隱藏內部細節,只能通過方法訪問
private String accountNumber; // 帳號
private String accountHolder; // 帳戶人姓名
private double balance; // 餘額
private String accountType; // 帳戶類型
// 建構子:初始化帳戶
public BankAccount(String accountNumber, String accountHolder, String accountType) {
this.accountNumber = accountNumber;
this.accountHolder = accountHolder;
this.accountType = accountType;
this.balance = 0;
}
// === 封裝:提供安全的getter ===
public String getAccountNumber() {
return accountNumber;
}
public String getAccountHolder() {
return accountHolder;
}
public double getBalance() {
return balance;
}
public String getAccountType() {
return accountType;
}
// === 封裝:提供安全的setter ===
// 存錢 - 增加餘額
protected void addBalance(double amount) {
if (amount > 0) {
balance += amount;
}
}
// 提錢 - 減少餘額
protected void subtractBalance(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
}
}
// === Abstract 抽象方法 ===
// 每種帳戶的利息計算方式不同,由子類別實現
abstract double calculateInterest();
// 每種帳戶可能有不同的手續費規則
abstract double calculateFee(double amount);
// === 通用的存錢方法(所有帳戶相同) ===
@Override
public void deposit(double amount) {
if (amount <= 0) {
System.out.println(" 存入金額必須大於0!");
return;
}
addBalance(amount);
System.out.println(" 已存入 " + amount + " 元");
}
// === 通用的提錢方法(但會調用各子類別的手續費計算) ===
@Override
public void withdraw(double amount) {
if (amount <= 0) {
System.out.println("提取金額必須大於0!");
return;
}
// 計算手續費(由子類別實現)
double fee = calculateFee(amount);
double totalAmount = amount + fee;
if (totalAmount > balance) {
System.out.println(" 餘額不足!需要 " + totalAmount + " 元(含手續費)");
return;
}
subtractBalance(totalAmount);
System.out.println("已提取 " + amount + " 元(手續費:" + fee + " 元)");
}
// === 通用的列印帳單方法 ===
@Override
public void printStatement() {
System.out.println("\n========== 帳戶明細 ==========");
System.out.println("帳戶類型:" + accountType);
System.out.println("帳號:" + accountNumber);
System.out.println("戶名:" + accountHolder);
System.out.println("餘額:" + balance + " 元");
System.out.println("利息:" + calculateInterest() + " 元");
System.out.println("=============================\n");
}
}
|
Inheritance And Polymorphism
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89 | // ============================================
// 第三部分:具體的帳戶類別 - Inheritance 繼承
// ============================================
/**
* 儲蓄帳戶 - 繼承BankAccount
* Inheritance - 繼承父類別的所有方法和屬性
* Polymorphism - 覆蓋calculateInterest()和calculateFee()方法
*/
class SavingsAccount extends BankAccount {
// 儲蓄帳戶的利率
private static final double INTEREST_RATE = 0.02; // 年利率2%
public SavingsAccount(String accountNumber, String accountHolder) {
super(accountNumber, accountHolder, "儲蓄帳戶");
}
// === Polymorphism 多態性 ===
// 覆蓋父類別的方法,提供自己的實現
@Override
double calculateInterest() {
// 儲蓄帳戶:利息 = 餘額 × 利率
return getBalance() * INTEREST_RATE;
}
@Override
double calculateFee(double amount) {
// 儲蓄帳戶:手續費很低,只有0.1%
return amount * 0.001;
}
}
/**
* 支票帳戶 - 繼承BankAccount
* Inheritance - 繼承父類別的所有方法和屬性
* Polymorphism - 覆蓋calculateInterest()和calculateFee()方法
*/
class CheckingAccount extends BankAccount {
// 支票帳戶的利率更低
private static final double INTEREST_RATE = 0.005; // 年利率0.5%
public CheckingAccount(String accountNumber, String accountHolder) {
super(accountNumber, accountHolder, "支票帳戶");
}
// === Polymorphism 多態性 ===
@Override
double calculateInterest() {
// 支票帳戶:利息更少
return getBalance() * INTEREST_RATE;
}
@Override
double calculateFee(double amount) {
// 支票帳戶:手續費較高,0.5%
return amount * 0.005;
}
}
/**
* 定期帳戶 - 繼承BankAccount
* Inheritance - 繼承父類別的所有方法和屬性
* Polymorphism - 覆蓋calculateInterest()和calculateFee()方法
*/
class TermAccount extends BankAccount {
// 定期帳戶利率最高
private static final double INTEREST_RATE = 0.05; // 年利率5%
private static final double WITHDRAWAL_FEE = 50; // 固定手續費
public TermAccount(String accountNumber, String accountHolder) {
super(accountNumber, accountHolder, "定期帳戶");
}
// === Polymorphism 多態性 ===
@Override
double calculateInterest() {
// 定期帳戶:利息最高
return getBalance() * INTEREST_RATE;
}
@Override
double calculateFee(double amount) {
// 定期帳戶:固定手續費50元
return WITHDRAWAL_FEE;
}
}
|
BankSystem Class And Main Method
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 | // ============================================
// 第四部分:主程式 - 展示所有概念
// ============================================
public class BankSystem {
public static void main(String[] args) {
System.out.println("銀行帳戶系統\n");
// 建立三種不同類型的帳戶
Account savings = new SavingsAccount("2024001", "王小明");
Account checking = new CheckingAccount("2024002", "李小華");
Account term = new TermAccount("2024003", "張小美");
// ========================================
// 演示1:存錢 - 所有帳戶用同一方法
// ========================================
System.out.println("--- 第一步:存錢 ---");
savings.deposit(10000);
checking.deposit(10000);
term.deposit(10000);
// ========================================
// 演示2:查詢餘額
// ========================================
System.out.println("\n--- 第二步:查詢餘額 ---");
System.out.println("儲蓄帳戶餘額:" + savings.getBalance() + " 元");
System.out.println("支票帳戶餘額:" + checking.getBalance() + " 元");
System.out.println("定期帳戶餘額:" + term.getBalance() + " 元");
// ========================================
// 演示3:提錢 - 展示Polymorphism多態性
// (同樣的方法,不同帳戶的手續費不同!)
// ========================================
System.out.println("\n--- 第三步:提錢(展示多態性 - 手續費不同) ---");
System.out.println("\n儲蓄帳戶提2000元:");
savings.withdraw(2000); // 手續費2元
System.out.println("支票帳戶提2000元:");
checking.withdraw(2000); // 手續費10元
System.out.println("定期帳戶提2000元:");
term.withdraw(2000); // 手續費50元
// ========================================
// 演示4:列印帳單 - 展示Polymorphism
// (同樣的方法,不同帳戶的利息不同!)
// ========================================
System.out.println("--- 第四步:列印帳單(展示多態性 - 利息不同) ---");
savings.printStatement(); // 利息:2%
checking.printStatement(); // 利息:0.5%
term.printStatement(); // 利息:5%
// ========================================
// 演示5:統一處理所有帳戶
// (這就是Interface的威力!)
// ========================================
System.out.println("--- 第五步:用一個方法處理所有帳戶類型 ---");
Account[] allAccounts = {savings, checking, term};
System.out.println("給所有帳戶都存5000元:");
for (Account acc : allAccounts) {
acc.deposit(5000);
}
System.out.println("\n從所有帳戶都提1000元:");
for (Account acc : allAccounts) {
acc.withdraw(1000);
}
System.out.println("\n所有帳戶的最終狀態:");
for (Account acc : allAccounts) {
acc.printStatement();
}
}
}
|