构造器重载调用次数疑问:Java账户实例化静态计数异常排查
问题分析与解决
问题根源
你猜的完全正确——每次调用无参构造时,numberOfAccounts会被自增两次,这就是计数异常的核心原因:
- 当执行
new BankAccount()时,无参构造的第一行this(0, 0)会调用带参构造,带参构造里已经执行了numberOfAccounts++; - 带参构造执行完毕后,程序回到无参构造,又会执行一次
numberOfAccounts++,等于一次无参实例化触发了两次计数增加。
对应你的测试场景:
account1和account2用带参构造,各触发1次自增,累计2;account3用无参构造,触发2次自增,累计2+2=4,和你实际得到的结果一致;- 再新增一个无参实例
account4,会再增加2,最终累计6,也符合你的观察。
修复方案
只需要在仅一个构造方法中保留numberOfAccounts++即可,推荐修改无参构造,删掉其中的自增语句,因为带参构造是更基础的实现:
public class BankAccount { private double checkingBalance; private double savingBalance; private static int numberOfAccounts; public BankAccount() { this(0, 0); // 移除这行重复的自增代码 } public BankAccount(double checkingInitial, double savingInitial) { this.checkingBalance = checkingInitial; this.savingBalance = savingInitial; numberOfAccounts++; } public static int getNumberOfAccounts() { return numberOfAccounts; } }
修改后,无论用哪种构造方法实例化对象,numberOfAccounts都会只被自增一次,就能得到正确的计数结果。
内容的提问来源于stack exchange,提问作者Jamal Harb
相关产品推荐
相关产品推荐

