// Accounts2 example -- Lowis & Loftus 1st edition, page 306. class BankAccount { protected int account; protected double balance; public BankAccount (int accountNum, double initBalance) { account = accountNum; balance = initBalance; } public void deposit (double amount) { balance += amount; System.out.println ("Deposit into account " + account); System.out.println ("Amount: " + amount); System.out.println ("New balance: " + balance); System.out.println(); } public boolean withdrawal (double amount) { boolean result = false; System.out.println ("Withdrawal from account " + account); System.out.println ("Amount: " + amount); if (amount > balance) System.out.println ("Insufficient funds."); else { balance -=amount; System.out.println ("New balance: " + balance); result = true; } System.out.println(); return result; } } class CheckingAccount extends BankAccount { private SavingsAccount overdraft; public CheckingAccount (int accountNum, double initBalance, SavingsAccount protection) { super (accountNum, initBalance); overdraft = protection; } public boolean withdrawal (double amount) { boolean result = false; if (! super.withdrawal (amount)) { System.out.println ("Using overdraft..."); if (! overdraft.withdrawal (amount - balance)) System.out.println ("Overdraft source insufficient."); else { balance = 0; System.out.println ("New balance on account " + account + ": " + balance); result = true; } } System.out.println (); return result; } } class SavingsAccount extends BankAccount { protected double rate; public SavingsAccount (int accountNum, double initBalance, double intRate) { super (accountNum, initBalance); rate = intRate; } public void addInterest () { balance += balance * rate; System.out.println ("Interest added to account " + account); System.out.println ("New balance: " + balance); System.out.println(); } } class BonusSaver extends SavingsAccount { private final int PENALTY = 25; private final double BONUS_RATE = 0.03; public BonusSaver (int accountNum, double initBalance, double intRate) { super (accountNum, initBalance, intRate); } public boolean withdrawal (double amount) { System.out.println ("Penalty incurred: " + PENALTY); return super.withdrawal (amount + PENALTY); } public void addInterest () { balance += balance * (rate + BONUS_RATE); System.out.println ("Interest added to account " + account); System.out.println ("New balance: " + balance); System.out.println(); } } class Accounts2 { public static void main (String[] args) { SavingsAccount savings = new SavingsAccount (4321, 8921.39, 0.02); BonusSaver bigSavings = new BonusSaver (6543, 1234.00, 0.02); CheckingAccount checking = new CheckingAccount (7890, 345.66, savings); savings.deposit (456.09); bigSavings.deposit (456.09); savings.withdrawal (555.99); bigSavings.withdrawal (666.88); checking.withdrawal (555.98); } }