Java构造器内调用自增方法后卡号变量未按序递增问题
问题根因
- 代码中定义的
numCartao是实例成员变量,每新建一个CartaoCliente实例,都会为该实例独立初始化一份numCartao,初始值固定为1,不同实例的该属性完全独立、互不共享。 - 构造方法调用的
incCartao()仅对当前实例自身的numCartao做自增,执行后值固定为2,因此所有实例的卡号最终都是2,无法实现跨实例的连续自增逻辑。
修复方案
要实现全局连续自增的唯一卡号,需要拆分全局计数器和实例自身的卡号属性:
- 新增
static修饰的类级别计数器,该计数器归CartaoCliente类本身所有,仅在类加载时初始化一次,所有实例共享同一份计数器值。 - 保留实例级别的
numCartao属性,用于存储当前实例分配到的专属卡号,不要与全局计数器混用。 - 调整构造方法逻辑:创建实例时先将当前计数器值赋值给实例的
numCartao,再将计数器自增,即可保证第一个实例卡号为1,后续实例依次拿到连续递增的序号。
修复后的完整代码如下:
public class CartaoCliente { // 类级别的全局共享计数器,所有实例共用 private static long contadorCartao = 1; // 实例专属卡号,每个实例存储自己分配到的序号 private long numCartao; String nome; Boolean estado; public CartaoCliente(String nomeCartao){ // 给当前实例分配卡号 this.numCartao = contadorCartao; // 全局计数器自增,为下一个实例准备序号 contadorCartao++; this.nome = nomeCartao; } @Override public String toString(){ return "Número: " + numCartao + ", Nome: " + nome; } } public class TesteCartao { public static void main(String[] args) { CartaoCliente c = new CartaoCliente("José"); CartaoCliente d= new CartaoCliente("Esdrubal"); System.out.println(c.toString()); System.out.println(d.toString()); } }
运行测试类后的输出符合预期:
Número: 1, Nome: José Número: 2, Nome: Esdrubal
内容的提问来源于stack exchange,提问作者nuno
相关产品推荐
相关产品推荐

