我对 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);
希望这有助于解决问题。
如果您希望所有对象共享相同的
balance
字段,则必须添加 static
修饰符。否则将为每个对象创建一个新成员。
如果您只需要一份具有相同余额的副本,
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();
或者你也可以克隆。
假设方法调用正确,您可以使用 static 关键字(例如“static int Balance;”)共享余额变量。
这样做时,您可以使变量属于项目中的所有类并在它们之间共享。要使用此变量,只需引用其名称,在本例中使用“balance = [插入公式];” (不再需要使用“this.balance”)。
当您执行
balance
时,您正在创建 new balance()
类的新实例。因此本质上一个类仍然引用旧实例,而新类引用新实例。
你应该采取的方式取决于程序的其余部分,但如果你想引用同一个实例,你应该在
balance
类中放置一个额外的方法,称为 updateBalance()
,它会改变平衡,或者根据是提款还是存款来减少/增加它。
但是,你的设计似乎有点奇怪。看来执行取款或存款的两个类实际上应该引用同一个银行帐户。平衡类似乎有点多余。
其他人建议的
static
行为方法肯定有助于实现解决方案,但是,请记住您仍然是 Java 初学者的开场白,我建议您完全更改您的类设计,以使其更有效符合面向对象的设计。
创建一个名为
Account
的类,并以 Balance
作为其属性。拥有一个具有 Account
属性的 HAS
对象(就像在现实世界中一样)是有意义的。账户对应的 Balance
或 withdraw
动作可以放在同一个 deposit
类中,符合 OOP/Java 的封装范式。这将有助于更直观地理解程序中变量的流动。Account
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
实例将保持相同的值,这可能不是您想要的。另请参阅: