Не возвращает остаток денег суперклассу (задача на ООП)

Добрый день! Суть задачи: есть три банковских счета, которые могут списавать свои деньги, добавлять туда деньги и переводить деньги друг другу с счета на счет. Единственное хитрое условие с кредитным аккаунтом: CreditAccount : он никак не может быть положительным. Проблема: Я не могу реализовать, что когда идет перевод денег с одного счета на кредитный CreditAccount , то должно быть возвращение денег freeMoney на счет который изначально переводил деньги.
То есть логика такая: 1600 рублей переводится со сберегательного счета SavingsAccount на кредитный счет CreditAccount → на кредитном счете CreditAccount в данный момент -100 рублей → кредитный счет CreditAccount добирает в себя +100 рублей и становится равным 0 → 1500 рублей возвращаются обратно в сберегательный счет SavingsAccount .
Я пытался этот остаток freeMoney вернуть как:

super.setAmount(super.getAmount()+freeMoney);

но понимаю, что это неправильно, т.к. это не суперкласс. А других идей нет. Подскажите\покажите как можно вернуть этот остаток?
Мой код ниже:

public class Main {
    public static void main(String[] args) {
        SavingsAccount savingsAccount = new SavingsAccount
                (2600, "SavingsAcnt#1");
        CheckingAccount checkingAccount = new CheckingAccount
                (2900, "CheckingAcnt#1");
        CreditAccount creditAccount = new CreditAccount
                (0, "CreditAcnt#1");
 
        savingsAccount.transfer(checkingAccount, 100);
        savingsAccount.addMoney(50);
        setApart();//***********************************
        checkingAccount.transfer(creditAccount, 1300);
        checkingAccount.pay(100);
        checkingAccount.addMoney(250);
        setApart();//*************************************
        creditAccount.transfer(checkingAccount, 200);
        creditAccount.pay(300);
        creditAccount.addMoney(5150);
    }
 
    public static void setApart() {
        for (int i = 0; i < 50; i++) {
            System.out.print("*");
        }
        System.out.println();
    }
}
public abstract class Account {
    private int amount;
    private String accountName;
 
    public int getAmount() {
        return amount;
    }
 
    public String getAccountName() {
        return accountName;
    }
 
    public void setAmount(int amount) {
        this.amount = amount;
    }
 
    public Account(int amount, String accountName) {
        this.amount = amount;
        this.accountName = accountName;
    }
 
    void pay(int amount) {
        setAmount(getAmount() - amount);
    }
 
    void transfer(Account account, int amount) {
        account.setAmount(account.getAmount() + amount);
        this.setAmount(getAmount() - amount);
    }
 
    void addMoney(int amount) {
        setAmount(getAmount() + amount);
    }
}
public class CheckingAccount extends Account {
    public CheckingAccount(int amount, String accountName) {
        super(amount, accountName);
    }
 
    @Override
    void pay(int amount) {
        if ((getAmount() - amount) < 0) System.out.println("Not enough money");
        else {
            int thisTempAmount = getAmount();
            setAmount(getAmount() - amount);
            System.out.printf("%d $ marked off %s; %d $-> %d $ %n",
                    amount, getAccountName(), thisTempAmount, getAmount());
        }
    }
 
    @Override
    void transfer(Account account, int amount) {
        if ((getAmount() - amount) < 0) System.out.println("Not enough money");
        else {
            int thisTempAmount = getAmount();
            setAmount(getAmount() - amount);
            System.out.printf("%d $ marked off %s; %d $-> %d $ %n",
                    amount, getAccountName(), thisTempAmount, getAmount());
            account.addMoney(amount);
        }
    }
 
    @Override
    void addMoney(int amount) {
        int thisTempAmount = getAmount();
        setAmount(getAmount() + amount);
        System.out.printf("%d $ settled an %s; %d $-> %d $ %n",
                amount, getAccountName(), thisTempAmount, getAmount());
    }
}
public class CreditAccount extends Account {
    public CreditAccount(int amount, String accountName) {
        super(amount, accountName);
    }
 
    @Override
    void pay(int amount) {
        int thisTempAmount = getAmount();
        setAmount(getAmount() - amount);
        System.out.printf("%d $ marked off %s; %d $-> %d $ %n",
                amount, getAccountName(), thisTempAmount, getAmount());
    }
 
    @Override
    void transfer(Account account, int amount) {
        int thisTempAmount = getAmount();
        setAmount(getAmount() - amount);
        System.out.printf("%d $ marked off %s; %d $-> %d $ %n",
                amount, getAccountName(), thisTempAmount, getAmount());
        account.addMoney(amount);
    }
 
    @Override
    void addMoney(int amount) {
        if ((getAmount() + amount) > 0) {
            int thisTempAmount = getAmount();
            System.out.printf("%s's can't be positives%n",
                    getClass().getSimpleName());
            int freeMoney = amount + getAmount();
            setAmount(0);
            System.out.printf("%d $ settled an %s; %d $-> %d $ %n" +
                            "%d $ for return%n",
                    -thisTempAmount, getAccountName(),
                    thisTempAmount, getAmount(), freeMoney);
        //    super.setAmount(super.getAmount()+freeMoney);
        } else {
            int thisTempAmount = getAmount();
            setAmount(getAmount() + amount);
            System.out.printf("%d $ settled an %s; %d $-> %d $ %n",
                    amount, getAccountName(), thisTempAmount, getAmount());
        }
    }
}
public class SavingsAccount extends Account {
    public SavingsAccount(int amount, String accountName) {
        super(amount, accountName);
    }
 
    @Override
    void transfer(Account account, int amount) {
        if ((getAmount() - amount) < 0) System.out.println("Not enough money");
        else {
            int thisTempAmount = getAmount();
            setAmount(getAmount() - amount);
            System.out.printf("%d $ marked off %s; %d $-> %d $ %n",
                    amount, getAccountName(), thisTempAmount, getAmount());
            account.addMoney(amount);
        }
    }
 
    @Override
    void addMoney(int amount) {
        int thisTempAmount = getAmount();
        setAmount(getAmount() + amount);
        System.out.printf("%d $ settled an %s; %d $-> %d $ %n",
                amount, getAccountName(), thisTempAmount, getAmount());
 
    }
}

Так это ж разные объекты.
Видимо надо как-нибудь передавать экземпляр SavingsAccount в CreditAccount.

Как это можно сделать? Например

Как угодно, от задачи зависит. Например, передать в конструкторе и сохранить в поле объекта. Как имя и начальная сумма.

Ну вот я не совсем понимаю, как это можно передать

Так же как и это:

ну только это видимо нужно только в CreditAccount, а не в базовом классе, так что не передавать базовому тут

а самому сохранять в свое поле.

Добавил:

 private  String accountName;
 private  int amount;
 public void Account2(int amount, String accountName) {
        this.amount = amount;
        this.accountName = accountName;
    }

но не совсем понимаю, как передать в

 @Override
    void addMoney(int amount) {
..........
Account2(1, savingsAccount);

не совсем понимаю, как передать :hear_no_evil:

Так а зачем Account2?

CheckingAccount checkingAccount = new CheckingAccount
                (2900, "CheckingAcnt#1", savingsAccount);

Я Вас, наверное, достал своей тупостью))) но зачем мне передавать 3 параметра мейне? у меня в abstract account надо всего 2 параметра передать и это должно хватить

Если даже такой метод реализовать, то он не всегда будет возвращать на нужный счет, поскольку помимо CheckingAccount есть ещё и CreditAccount и если CreditAccount будет переводить экстра деньги, то он вернет в CheckingAccount — что неверно. Нужно какую-то проверку сделать или как-то вернуть возвращаемому объекту этот остаток…

 @Override
    void addMoney(int amount) {
        if ((getAmount() + amount) > 0) {
            int thisTempAmount = getAmount();
            System.out.printf("%s's can't be positives%n",
                    getClass().getSimpleName());
            int freeMoney = amount + getAmount();
            setAmount(0);
            System.out.printf("%d $ settled an %s; %d $-> %d $ %n" +
                            "%d $ for return%n",
                    -thisTempAmount, getAccountName(),
                    thisTempAmount, getAmount(), freeMoney);
            //    super.setAmount(super.getAmount()+freeMoney);
//            Account2(1, getAccountName());
            CheckingAccount checkingAccount = new CheckingAccount(freeMoney, "checkingAccount");
            checkingAccount.addMoney(freeMoney);

Или вы предлагаете изначально передавать 3 параметра, чтобы потом передавать в метод
void addMoney(int amount, Account account) {
два параметра, чтобы по второму параметру вернуть?

Чтобы иметь ссылку на этот экземпляр savingsAccount и возвращать ему когда надо.
Иначе откуда вы его возьмете?

1 лайк