You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何将Account嵌套的信用卡借记卡类拆分为独立关联类

实现思路

  • 首先修正原代码的核心问题:原Account类的balance、accountNumber用了static修饰,会导致所有账户共享同一个余额和账号,完全不符合业务逻辑,先把static修饰符去掉,改成每个Account实例独有属性
  • 拆分后的DebitCard、CreditCard类内部持有关联Account的引用,这样消费/还款时可以直接操作对应绑定账户的余额
  • Account类新增借记卡、信用卡成员变量,提供绑定卡片的方法,支持创建账户时直接绑定对应卡片,也支持后续绑定
  • 修复原有CreditCard类creditCardPurchase方法重复累加债务、重复扣减额度的bug

1. 独立Account类代码

package accounts;

public class Account {
    // 去掉static修饰,每个账户独有余额和账号
    protected double balance;
    protected String accountNumber;
    // 关联的借记卡、信用卡
    private DebitCard debitCard;
    private CreditCard creditCard;

    public Account() {
    }

    public Account(String accountNumber, double balance) {
        this.accountNumber = accountNumber;
        this.balance = balance;
    }

    // 绑定借记卡方法
    public void bindDebitCard(String userName, int cardNumber) {
        this.debitCard = new DebitCard(userName, cardNumber, this);
    }

    // 绑定信用卡方法
    public void bindCreditCard(String userName, int cardNumber, double limit) {
        this.creditCard = new CreditCard(userName, cardNumber, limit, this);
    }

    // 获取绑定的借记卡
    public DebitCard getDebitCard() {
        return debitCard;
    }

    // 获取绑定的信用卡
    public CreditCard getCreditCard() {
        return creditCard;
    }

    public double getBalance() {
        return balance;
    }

    public String getAccountNumber() {
        return accountNumber;
    }

    public void deposit(double depositAmount) {
        this.balance += depositAmount;
    }

    public void extraction(double extractionAmount) {
        this.balance -= extractionAmount;
    }

    public void showBalance() {
        System.out.println("Your current balance is: " + getBalance());
    }
}

2. 独立DebitCard类代码

package accounts;

public class DebitCard {
    private String userName;
    private int cardNumber;
    // 持有绑定的账户引用
    private Account bindAccount;

    public DebitCard() {
    }

    // 构造方法传入绑定的账户
    public DebitCard(String userName, int cardNumber, Account bindAccount) {
        this.userName = userName;
        this.cardNumber = cardNumber;
        this.bindAccount = bindAccount;
    }

    public String getUserName() {
        return userName;
    }

    public int getCardNumber() {
        return cardNumber;
    }

    public void debitPurchase(double purchaseAmount) {
        // 操作绑定账户的余额
        bindAccount.extraction(purchaseAmount);
    }
}

3. 独立CreditCard类代码

package accounts;

public class CreditCard {
    private String userName;
    private int cardNumber;
    private double creditCardDebt;
    private double limit;
    // 持有绑定的账户引用
    private Account bindAccount;

    public CreditCard() {
    }

    public CreditCard(String userName, int cardNumber, double limit, Account bindAccount) {
        this.userName = userName;
        this.cardNumber = cardNumber;
        this.limit = limit;
        this.bindAccount = bindAccount;
    }

    public String getUserName() {
        return userName;
    }

    public int getCardNumber() {
        return cardNumber;
    }

    public double getLimit() {
        return limit;
    }

    public double getCreditCardDebt() {
        return creditCardDebt;
    }

    public void creditCardPurchase(double purchaseAmount) {
        if (this.creditCardDebt + purchaseAmount > this.limit) {
            throw new Error("There's not enough limit to make this purchase");
        }
        // 修复原代码重复计算的bug
        this.creditCardDebt += purchaseAmount + (purchaseAmount * 0.03);
        this.limit -= purchaseAmount;
    }

    public void payCard(double payAmount) {
        // 从绑定账户扣减还款金额
        bindAccount.extraction(payAmount);
        this.creditCardDebt -= payAmount;
    }
}

使用示例

public class Test {
    public static void main(String[] args) {
        // 1. 创建账户,初始余额10000元
        Account myAccount = new Account("622202xxxx", 10000);
        // 2. 绑定借记卡
        myAccount.bindDebitCard("张三", 12345678);
        // 3. 绑定信用卡,额度5000元
        myAccount.bindCreditCard("张三", 87654321, 5000);

        // 借记卡消费1000元
        myAccount.getDebitCard().debitPurchase(1000);
        myAccount.showBalance(); // 输出余额9000

        // 信用卡消费1000元,债务+1030(含3%利息),额度剩4000
        myAccount.getCreditCard().creditCardPurchase(1000);
        System.out.println("信用卡当前债务:" + myAccount.getCreditCard().getCreditCardDebt()); // 输出1030
        System.out.println("信用卡剩余额度:" + myAccount.getCreditCard().getLimit()); // 输出4000

        // 信用卡还款1030元
        myAccount.getCreditCard().payCard(1030);
        myAccount.showBalance(); // 输出余额7970
        System.out.println("信用卡当前债务:" + myAccount.getCreditCard().getCreditCardDebt()); // 输出0
    }
}

内容的提问来源于stack exchange,提问作者Wasivis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:48:03