我是Java的新手,需要一些我正在撰写的程序的帮助。基本上我有2个班级试图改变银行账户的余额。一类是增加存款而另一类是撤销。我虽然在类之间分享平衡的最简单方法是制作一个看起来像这样的第三个类:
public class Balance {
static int balance;
public int getBalance(){
return balance;
}
public void returnBalance(int bal){
this.balance = bal;
}
}
我正在调用getBalance方法,因为这样可以实现正确的平衡。但是,当我使用我的对象Balance balanceCall = new Balance();
来提供更改的余额(存款后)时,它不会更新类中的余额。我想我再次正确地调用该方法,但它似乎并没有真正改变我的balance类中的balance变量的值。我的余额类中的代码是否错误地用于returnBalance
方法?
感谢您的帮助!
更新:我将整数更改为静态int balance。它现在正在更新类之间的值,但是每次我存款时它似乎都在创建一个新值。
这就是它的样子:
线程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);
希望这有助于清理事情。
已解决:将我的变量更改为static int balance
后,这适合我的程序用途,因为只需要一个余额,它几乎解决了问题。我改变了逻辑,现在它有效。我没有更新余额并将此值发送回Balance类,而是在Balance类中创建了一个新方法,并向其发送了我想要提取/存入多少的值,然后是字符串" Withdraw"或者"存款"执行正确的计算。现在它似乎正确地更新了平衡。谢谢大家的帮助!
答案 0 :(得分:1)
如果您希望所有对象共享相同的balance
字段,则必须添加static
修饰符。否则,将为每个对象创建一个新成员。
答案 1 :(得分:1)
假设方法调用正确,您可以使用 static 关键字(例如"静态int balance;")来共享您的余额变量。
这样,您可以使变量属于项目中的所有类,并在它们之间共享。要使用此变量,只需引用其名称,在这种情况下使用" balance = [insert formula];" (不再需要使用" this.balance")。
答案 2 :(得分: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();
或者你也可以克隆。
答案 3 :(得分:0)
当您执行balance
时,您正在创建new balance()
类的新实例。所以基本上一个类仍然引用旧实例,而新类指的是新类。
你应该采取的方式取决于程序的其余部分,但如果你想引用同一个实例,你应该在balance
类中添加一个额外的方法,称为{{1它会改变余额,或者可能会减少/增加余额,具体取决于它是取款还是存款。
但是,你的设计似乎有点奇怪。似乎执行提款或存款的两个类别实际上应该指的是同一个银行账户。平衡等级似乎有点多余。
答案 4 :(得分:0)
其他人建议的static
行为方法肯定有助于实现解决方案,但是,请记住您仍然是Java初学者的开头行,我建议您完全改变您的类设计,使其更符合面向对象的设计。
创建一个名为Account
的类,其中Balance
为其属性。拥有Account
HAS
Balance
属性的withdraw
对象(就像在现实世界中一样)是有意义的。根据OOP / Java的封装范例,对应于帐户的deposit
或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;
}
}
}
类中。这将有助于更直观地理解程序中的变量流。
String
答案 5 :(得分:0)
这似乎是线程同步的问题,即丢失更新。这意味着,如果您从多个线程读取和写入相同的值,则某些计算将不会在最终结果中表示。您可以使用课程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
,因为这样您的所有Balance
实例都将保留相同的值,这可能不是您想要的。
另见: