Как заставить объекты взаимодействовать друг с другом в Java?

Я недавно начал изучать Java. Это может быть глупым вопросом, но возможно ли создать метод, который переносит баланс из объекта firstAccount в объект secondAccount?

public class SavingsAccount{
  int balance;

  public SavingsAccount(String name, int balance){
    this.balance = balance;
    this.name = name;
  }

  public static void main(String[] args){
    SavingsAccount firstAccount = new SavingsAccount("A", 5000);
    SavingsAccount secondAccount = new SavingsAccount("B", 3000);
  }
}

Лучшее, что я придумал, это

public void transfer(int amountToTransfer){
    firstAccount.balance += amountToTransfer;
    secondAccount.balance -= amountToTransfer;
  }

и, конечно, это не работает. Как я могу это исправить?
Заранее спасибо!

Всего 3 ответа


Вы можете либо сделать его static методом, который требует, чтобы вы передавали две учетные записи, которые будут использоваться (вы можете называть переменные, как хотите), либо создать нестатический метод, который требует одну учетную запись в качестве параметра при использовании экземпляра.

Вот static вариация:

public static void transfer(int amountToTransfer, SavingsAccount toAccount, SavingsAccount fromAccount){
    toAccount.balance += amountToTransfer;
    fromAccount.balance -= amountToTransfer;
}

Это будет использоваться в static контексте, таком как main , и будет вызываться с использованием YourClass.transfer(yourAmount, firstAccount, secondAccount) .

Вот нестатический вариант, который будет внутри вашего класса SavingsAccount , вы можете решить, имеет ли смысл переносить его в экземпляр или из экземпляра:

public void transfer(int amountToTransfer, SavingsAccount toAccount){
    toAccount.balance += amountToTransfer;
    this.balance -= amountToTransfer;
}

Это будет использоваться с вашим экземпляром firstAccount.transfer(amount, secondAccount) и будет переводить сумму из firstAccount в secondAccount . Я рекомендую использовать этот способ, а не static опцию.

Ниже приведен пример того, как использовать оба из вашего main :

public static void main(String[] args){
   SavingsAccount firstAccount = new SavingsAccount("A", 5000);
   SavingsAccount secondAccount = new SavingsAccount("B", 3000);

   int amount = 500;
   firstAccount.transfer(amount, secondAccount); //This is the non-static variation
   transfer(amount, firstAccount, secondAccount); //Static variation, you might need to use the Class.transfer
}

Это очень возможно, но в вашем коде ваш класс SavingsAccount не имеет переменной с именем name. Вы должны создать это в первую очередь. Кроме того, вы должны добавить две переменные сберегательного счета в класс и сделать их статическими. Затем вы сможете получить доступ к этим сберегательным счетам из функции. Вы также должны сделать функцию перевода денег статической. Ваш окончательный код может выглядеть так:

public static class SavingsAccount {

    int balance;
    String name;

    public static SavingsAccount firstAccount = new SavingsAccount("A", 5000);
    public static SavingsAccount secondAccount = new SavingsAccount("B", 3000);

    public SavingsAccount(String name, int balance) {
        this.name = name;
        this.balance = balance;
    }

    public static void transfer(int amountToTransfer){
        firstAccount.balance += amountToTransfer;
        secondAccount.balance -= amountToTransfer;
    }

    public static void main(String[] args) {
        transfer(put the amount to transfer here);
    }

}

но возможно ли создать метод, который переносит баланс из объекта firstAccount в объект secondAccount?

Есть много способов. Помимо подхода static метода уже упоминалось.

Вот несколько вариантов. Но, в конечном счете, идея та же самая - вам нужны 2 экземпляра объекта.

Идея 1 :

//Letting the object itself interact with another object (simplified):

public class SavingsAccount{
    String name;
    int balance;

    public SavingsAccount(String name, int balance){
      this.balance = balance;
      this.name = name;
    }

    public void transferTo(SavingsAccount receivingAccount, int amt){
        this.balance -= amt;
        receivingAccount += amt;    //recommended to use setter instead
    }  
}

Идея 2 :

//Letting the object itself interact with another object:

public class SavingsAccount{
    String name;
    int balance;

    public SavingsAccount(String name, int balance){
      this.balance = balance;
      this.name = name;
    }

    public int deductBalance(int amt){
        this.balance -= amt;
        return amt;
    } 

    public int addBalance(int amt){
        this.balance += amt;
        return amt;
    }  

    public void transferTo(SavingsAccount receivingAccount, int amt){
        receivingAccount.addBalance(this.deductBalance(amt));
    }
}

class TesterClass{
    SavingsAccount accountA = new SavingsAccount("A", 5000);
    SavingsAccount accountB = new SavingsAccount("B", 3000);
    accountA.transferTo(accountB, 100);   //transfer $100 from A to B
}

Идея 3 :

//Letting a 3rd party to let both objects intract. 
//The 2 objects doesn't need to each other's existance.

public class SavingsAccount{
    String name;
    int balance;

    public SavingsAccount(String name, int balance){
      this.balance = balance;
      this.name = name;
    }

    public void deductBalance(int amt){
        this.balance -= amt;
    } 

    public void addBalance(int amt){
        this.balance += amt;
    }    
}

class TesterClass{
    SavingsAccount accountA = new SavingsAccount("A", 5000);
    SavingsAccount accountB = new SavingsAccount("B", 3000);

    public static void transferMoney(SavingsAccount fromAcc, SavingsAccount toAcc, int amt){
        fromAcc.deductBalance(amt);
        toAcc.addBalance(amt);
    }
}

Количество способов продолжается .. вот только несколько ..


Есть идеи?

10000