项目概述

设计一个银行账户管理系统,模拟真实银行账户操作,包含存款、取款、转账等功能

学习目标

综合运用第六周所学知识:继承、接口、枚举、异常处理,构建健壮的银行系统

项目结构

  • 基类: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)