Java 类之间更新值

问题描述 投票:0回答:6

我对 Java 还很陌生,需要一些关于我正在编写的程序的帮助。基本上我有两个课程试图改变银行账户的余额。一类是增加存款,另一类是取款。我认为在班级之间共享平衡的最简单方法是创建第三个班级,如下所示:

public class Balance {
static int balance;

    public int getBalance(){
        return balance;
     }

    public void returnBalance(int bal){
        this.balance = bal;
    }
}

我正确地调用了 getBalance 方法,因为它拉动了正确的平衡。但是,当我使用对象

Balance balanceCall = new Balance();
提供更改后的余额(存款后)时,它不会更新类中的余额。我想我再次正确地调用了该方法,但它似乎并没有真正改变我的余额类中余额变量的值。我的余额类中的代码是否错误地用于
returnBalance
方法?

感谢您的帮助!

更新:我将整数更改为静态 int 余额。它现在正在更新类之间的值,但是每次我存款时它似乎都会创建一个新值。

这就是它的样子:

线程 1 存款 $76 余额为 $76

线程 8 提取 45 美元余额为 31 美元

线程 7 提取 12 美元余额为 64 美元

线程 6 提取 41 美元,余额为 35 美元

线程 3 存款 $89 余额为 $165

线程 5 提取 10 美元 余额为 66 美元

线程 4 提取 17 美元 余额为 59 美元

线程 2 存款 $157 余额为 $157

这是我如何使用

Balance
实例:

balanceNum = balanceCall.getBalance();
balanceNum = balanceNum + 25;
balanceCall.returnBalance(balanceNum);

希望这有助于解决问题。

java class methods
6个回答
0
投票

如果您希望所有对象共享相同的

balance
字段,则必须添加
static
修饰符。否则将为每个对象创建一个新成员。


0
投票

如果您只需要一份具有相同余额的副本,

public class Balance {
private int balance;

    public int getBalance()
    {
        return balance;
    }

    public void setBalance(int b)        
    { 
         balance=b;
    }

    public Balance newBalance()
    {
         Balance b=new Balance();
         b.setBalance(getBalance());
         return b;
    }
  }

用途:

  balanceCall=previousBalance.newBalance();

或者你也可以克隆。


0
投票

假设方法调用正确,您可以使用 static 关键字(例如“static int Balance;”)共享余额变量。

这样做时,您可以使变量属于项目中的所有类并在它们之间共享。要使用此变量,只需引用其名称,在本例中使用“balance = [插入公式];” (不再需要使用“this.balance”)。


0
投票

当您执行

balance
时,您正在创建
new balance()
类的新实例。因此本质上一个类仍然引用旧实例,而新类引用新实例。

你应该采取的方式取决于程序的其余部分,但如果你想引用同一个实例,你应该在

balance
类中放置一个额外的方法,称为
updateBalance()
,它会改变平衡,或者根据是提款还是存款来减少/增加它。

但是,你的设计似乎有点奇怪。看来执行取款或存款的两个类实际上应该引用同一个银行帐户。平衡类似乎有点多余。


0
投票

其他人建议的

static
行为方法肯定有助于实现解决方案,但是,请记住您仍然是 Java 初学者的开场白,我建议您完全更改您的类设计,以使其更有效符合面向对象的设计。

创建一个名为

Account
的类,并以
Balance
作为其属性。拥有一个具有
Account
属性的
HAS
对象(就像在现实世界中一样)是有意义的。账户对应的
Balance
withdraw
动作可以放在同一个
deposit
类中,符合 OOP/Java 的封装范式。这将有助于更直观地理解程序中变量的流动。

Account



0
投票

public class Account{ public int balance = 0; public void setBalance(int balance){ this.balance = balance; } public int getBalance(){ return this.balance; } public deposit(int amount){ this.balance += amount; } public withdraw(int amount){ //Additional validations can be added to ensure non-negative balance, if needed this.balance -= amount; } } public AccountDemo{ public static void main(String[] args){ Account account1 = new Account(); account1.deposit(100); Account account2 = new Account(); account2.deposit(50); account2.withdraw(10); //account1 has a balance of 100 & account2 has a balance of 40 at this point AccountDemo.transferMoney(account1, account2, 20); //account2 now has a balance of 80 (deducted by 20) // & account2 has a balance of 60(increased by 20) after the transfer. } public static boolean transferMoney(Account source, Account destination, int amount){ if(source.getBalance() >= amount){ source.withdraw(amount); destination.deposit(amount); System.out.println("Transfer successful"); return true; } else{ System.out.println("Sorry. Transfer failed due to insufficient funds."); return false; } } }

:
来解决这个问题 AtomicInteger

正确用法:

public class Balance { private AtomicInteger value = new AtomicInteger(); public int get() { return value.get(); } public void set(int value) { this.value.set(value); } public int addAndGet(int value) { return this.value.addAndGet(value); } }

错误用法:

int value = balance.addAndGet(25);

你必须使用
int value = balance.get(); value = value + 25; balance.set(25);

方法来防止更新丢失的问题。


此外,您绝对不应该将

addAndGet

属性声明为

value
,因为这样您的所有
static
实例将保持相同的值,这可能不是您想要的。

另请参阅:

    为什么静态变量被认为是邪恶的?
  • Java - 使用 AtomicInteger 与 Static int
© www.soinside.com 2019 - 2024. All rights reserved.