import java.util.ArrayList;
import java.util.List;

class Bank {
    private List<BankAccount> accounts;
    private double totalBankDeposits;

    public Bank() {
        accounts = new ArrayList<>();
        totalBankDeposits = 0.0;
    }

    public void createAccount(String accountHolder, double initialDeposit) {
        BankAccount newAccount = new BankAccount(accountHolder, initialDeposit);
        accounts.add(newAccount);
        totalBankDeposits += initialDeposit;
    }

    public void deposit(int accountNumber, double amount) {
        BankAccount account = findAccount(accountNumber);
        if (account != null) {
            account.deposit(amount);
            totalBankDeposits += amount;
        } else {
            System.out.println("Account not found.");
        }
    }

    public void withdraw(int accountNumber, double amount) {
        BankAccount account = findAccount(accountNumber);
        if (account != null) {
            if (account.getBalance() >= amount) {
                account.withdraw(amount);
                totalBankDeposits -= amount;
            } else {
                System.out.println("Insufficient funds.");
            }
        } else {
            System.out.println("Account not found.");
        }
    }

    public double getTotalBankDeposits() {
        return totalBankDeposits;
    }

    private BankAccount findAccount(int accountNumber) {
        for (BankAccount account : accounts) {
            if (account.getAccountNumber() == accountNumber) {
                return account;
            }
        }
        return null;
    }
}

class BankAccount {
    private static int accountCounter = 1000;
    private int accountNumber;
    private String accountHolder;
    private double balance;

    public BankAccount(String accountHolder, double initialDeposit) {
        this.accountNumber = accountCounter++;
        this.accountHolder = accountHolder;
        this.balance = initialDeposit;
    }

    public int getAccountNumber() {
        return accountNumber;
    }

    public double getBalance() {
        return balance;
    }

    public void deposit(double amount) {
        balance += amount;
    }

    public void withdraw(double amount) {
        balance -= amount;
    }
}

public class Main {
    public static void main(String[] args) {
        Bank bank = new Bank();

        bank.createAccount("John Doe", 1000.0);
        bank.createAccount("Jane Smith", 1500.0);

        bank.deposit(1000, 500.0);
        bank.withdraw(1001, 200.0);

        System.out.println("Total Bank Deposits: $" + bank.getTotalBankDeposits());
    }
}

Main.main(null);

This Java program demonstrates the concepts you mentioned:

  • Scope and Access: Private and public modifiers used in classes.
  • Method Decomposition: Each class has its own responsibility; methods are tasked with single operations.
  • Non-Void Methods: Methods like getBalance(), getAccountNumber(), and getTotalBankDeposits().
  • Void Methods: Methods like deposit(), withdraw(), and processTransaction().
  • Formal Parameters: Used in methods throughout the classes.
  • Reference vs. Primitive Parameters: Primitive types for account numbers, balances, etc., and references for account objects.