Java对象数组遍历打印仅输出最后一次录入值问题排查
运行异常根因分析
- 引用赋值逻辑错误
Java中对象数组的存储单元保存的是对象内存引用,而非对象实体本身。Tax[] y = new Tax[10]仅创建了长度为10、初始值为null的引用数组,不会自动生成10个独立的Tax实例。
你的代码在循环外仅创建了1个Tax对象x,循环中反复执行y[i] = x,等于将数组10个位置全部赋值为指向同一个x对象的引用,所有数组元素本质对应内存中的同一个实体。后续每次修改这个x对象的ssn、income属性时,所有通过数组引用读到的属性值都会同步变化,最终自然会重复输出最后一次修改的内容。 - 构造方法语法误判
你定义的void Tax(){}、void Tax(int s, int i)并不是类的构造方法:Java构造方法的规则是方法名与类名完全一致,且不允许声明任何返回值类型。给这两个方法加上void返回值后,它们就退化为普通的成员方法,和对象初始化逻辑没有任何绑定关系,仅能被手动调用、随时修改对象属性,进一步放大了属性被反复覆盖的问题。
修复方案指引
- 修正类定义的语法问题
去掉两个Tax方法前的void关键字,让它们成为真正的构造方法,用于在创建对象时完成ssn、income属性的初始化,无需手动调用方法修改属性。 - 修正数组的对象赋值逻辑
将Tax实例的创建逻辑移动到循环内部,每次循环在数组当前位置生成一个全新的独立Tax对象,不再复用循环外创建的单一对象引用。 - 修复后的可运行参考代码
import java.util.*; class Tax{ int ssn, income; // 去掉void,成为合法的无参构造 Tax(){} // 去掉void,成为合法的带参构造,用于初始化对象属性 Tax(int s, int i){ this.ssn = s; this.income = i; } int getssn(){ return ssn; } int getincome(){ return income; } } public class Usetaxpayer{ public static void main(String[] args){ Tax[] y = new Tax[10]; int i, inc, s = 100; Scanner in = new Scanner(System.in); // 删除循环外重复创建的单一Tax实例 for(i = 0; i < 10; i++) { inc = in.nextInt(); // 每次循环创建独立的新Tax对象存入数组对应位置 y[i] = new Tax(s, inc); s++; } for(i = 0; i < 10; i++) { System.out.println("SSN" + y[i].getssn() + " income" + y[i].getincome() + "\n"); } } }
修复后效果:数组每个位置存储的都是独立的Tax实例,各自保存对应录入的ssn与income值,遍历输出时不会出现所有位置内容重复为最后一次录入值的问题。
内容的提问来源于stack exchange,提问作者Princeofcoding
相关产品推荐
相关产品推荐

