项目概述
设计一个银行账户管理系统,模拟真实银行账户操作,包含存款、取款、转账等功能
学习目标
综合运用第六周所学知识:继承、接口、枚举、异常处理,构建健壮的银行系统
项目结构
- 基类:Account(账户)
- 子类:SavingsAccount(储蓄账户)和 CheckingAccount(支票账户)
- 接口:BankOperations(银行操作)
- 枚举:AccountType(账户类型)
- 自定义异常:InsufficientFundsException、InvalidAccountException
项目功能
- 创建不同类型的银行账户
- 存款和取款操作
- 账户间转账功能
- 账户信息查询
- 异常处理机制
知识应用
- 继承:SavingsAccount和CheckingAccount继承Account
- 接口:定义银行操作规范
- 枚举:定义账户类型常量
- 异常处理:try-catch-finally, throws, throw
Account (基类)
↓ extends
SavingsAccount (储蓄账户)
CheckingAccount (支票账户)
↑ implements
BankOperations (接口)
代码实现
分步骤实现银行账户管理系统核心功能
1
定义账户类型枚举
使用枚举定义账户类型常量
public enum AccountType {
SAVINGS, // 储蓄账户
CHECKING // 支票账户
}
枚举使用要点
枚举类型是特殊的类,用于定义一组常量,比传统常量更安全、可读性更好
2
定义银行操作接口
使用接口定义银行账户基本操作规范
public interface BankOperations {
void deposit(double amount); // 存款
void withdraw(double amount) throws InsufficientFundsException; // 取款
double getBalance(); // 获取余额
default void displayInfo() {
System.out.println("账户信息:");
}
}
接口特性
接口可以包含抽象方法、默认方法和静态方法。默认方法允许在接口中提供方法实现
3
实现基类Account
创建账户基类,包含公共属性和方法
public abstract class Account implements BankOperations {
protected String accountNumber;
protected String accountHolder;
protected double balance;
protected AccountType type;
public Account(String accountNumber, String accountHolder, double balance, AccountType type) {
this.accountNumber = accountNumber;
this.accountHolder = accountHolder;
this.balance = balance;
this.type = type;
}
// 存款方法
@Override
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
System.out.println("存款成功!当前余额:" + balance);
} else {
System.out.println("存款金额必须大于0");
}
}
// 抽象取款方法,由子类实现
@Override
public abstract void withdraw(double amount) throws InsufficientFundsException;
// 获取余额
@Override
public double getBalance() {
return balance;
}
// 显示账户信息(默认方法重写)
@Override
public void displayInfo() {
System.out.println("账户号码:" + accountNumber);
System.out.println("账户持有人:" + accountHolder);
System.out.println("账户类型:" + type);
System.out.println("当前余额:" + balance);
}
}
4
实现储蓄账户子类
SavingsAccount继承Account,添加特有属性和方法
public class SavingsAccount extends Account {
private double interestRate; // 储蓄账户特有属性:利率
public SavingsAccount(String accountNumber, String accountHolder,
double balance, double interestRate) {
super(accountNumber, accountHolder, balance, AccountType.SAVINGS);
this.interestRate = interestRate;
}
// 重写取款方法,添加储蓄账户限制
@Override
public void withdraw(double amount) throws InsufficientFundsException {
if (amount <= 0) {
System.out.println("取款金额必须大于0");
return;
}
if (balance >= amount) {
balance -= amount;
System.out.println("取款成功!当前余额:" + balance);
} else {
throw new InsufficientFundsException("余额不足!当前余额:" + balance);
}
}
// 添加储蓄账户特有方法:计算利息
public double calculateInterest() {
return balance * interestRate / 100;
}
}
继承要点
使用super关键字调用父类构造方法,通过方法重写实现多态
5
实现支票账户子类
CheckingAccount继承Account,添加透支额度功能
public class CheckingAccount extends Account {
private double overdraftLimit; // 支票账户特有属性:透支额度
public CheckingAccount(String accountNumber, String accountHolder,
double balance, double overdraftLimit) {
super(accountNumber, accountHolder, balance, AccountType.CHECKING);
this.overdraftLimit = overdraftLimit;
}
// 重写取款方法,支持透支
@Override
public void withdraw(double amount) throws InsufficientFundsException {
if (amount <= 0) {
System.out.println("取款金额必须大于0");
return;
}
if (balance + overdraftLimit >= amount) {
balance -= amount;
System.out.println("取款成功!当前余额:" + balance);
} else {
throw new InsufficientFundsException(
"超出透支额度!当前余额:" + balance + ", 透支额度:" + overdraftLimit);
}
}
}
6
定义自定义异常类
创建银行系统专用异常类
// 余额不足异常
public class InsufficientFundsException extends Exception {
public InsufficientFundsException(String message) {
super(message);
}
}
// 无效账户异常
public class InvalidAccountException extends Exception {
public InvalidAccountException(String message) {
super(message);
}
}
异常处理要点
自定义异常应继承Exception类,提供有意义的错误信息,方便问题排查
系统演示与测试
创建银行账户并进行操作演示,展示异常处理机制
1
创建银行账户
// 创建储蓄账户
Account savings = new SavingsAccount("SA001", "张三", 5000, 3.5);
// 创建支票账户
Account checking = new CheckingAccount("CA001", "李四", 3000, 2000);
2
存款操作演示
// 存款操作
savings.deposit(2000); // 存款2000
checking.deposit(1500); // 存款1500
存款成功!当前余额:7000.0
存款成功!当前余额:4500.0
3
取款操作与异常处理
// 尝试取款(正常情况)
try {
savings.withdraw(3000);
} catch (InsufficientFundsException e) {
System.out.println("错误: " + e.getMessage());
}
// 尝试取款(异常情况)
try {
checking.withdraw(7000); // 超出余额+透支额度
} catch (InsufficientFundsException e) {
System.out.println("错误: " + e.getMessage());
} finally {
System.out.println("取款操作已完成");
}
取款成功!当前余额:4000.0
错误: 超出透支额度!当前余额:4500.0, 透支额度:2000.0
取款操作已完成
try 代码块
→
异常发生?
↓是
catch 处理异常
↓
finally 块
动手练习
- 添加转账功能:transfer(Account target, double amount)
- 实现账户冻结功能,添加AccountFrozenException
- 为SavingsAccount添加每月利息结算功能
- 扩展枚举类型,添加CERTIFICATE_OF_DEPOSIT(定期存款)类型
常见错误与调试技巧
开发过程中常见的错误类型及解决方法
继承常见错误
- 错误:子类构造方法未调用super()
- 解决:子类构造方法第一行调用super(...)
- 错误:误用继承("is-a"关系不成立)
- 解决:重新评估类关系,考虑使用组合
接口常见错误
- 错误:未实现接口所有抽象方法
- 解决:实现所有抽象方法或将类声明为abstract
- 错误:默认方法冲突
- 解决:在实现类中重写冲突方法
异常处理常见错误
- 错误:捕获异常后不做任何处理
- 解决:至少记录异常信息
- 错误:过于宽泛的异常捕获(catch(Exception e))
- 解决:捕获具体异常类型
- 错误:忽略受检异常
- 解决:使用try-catch处理或throws声明
调试技巧
1. 使用IDE的调试功能设置断点
2. 使用System.out.println()输出关键变量值
3. 阅读异常堆栈跟踪,定位问题根源
4. 使用try-with-resources确保资源关闭
第六周知识总结
继承、接口、枚举和异常处理的核心概念
继承 (extends)
- 实现代码复用和层次化设计
- 子类继承父类属性和方法
- 使用super访问父类成员
- 方法重写实现多态
接口 (interface)
- 定义行为规范,实现多继承
- 包含抽象方法、默认方法和静态方法
- 实现类必须实现所有抽象方法
- 使用implements关键字实现接口
枚举 (enum)
- 定义一组命名常量
- 比传统常量更安全、可读
- 可以包含字段、方法和构造器
- 使用valueOf()和values()方法
异常处理
- try-catch-finally结构
- throws声明可能抛出的异常
- throw主动抛出异常
- 自定义异常继承Exception类
综合练习
- 为银行系统添加日志记录功能
- 实现账户流水记录(每笔交易记录)
- 添加账户管理类(Bank),支持多账户管理
- 使用枚举定义交易类型(DEPOSIT, WITHDRAWAL, TRANSFER)