练习Java getter/setter时打印方法仅输出最后一条注册人信息如何解决
问题原因
核心原因是单个类的实例只能存储一组数据。你每次调用setName()、setAge()方法时,都是直接覆盖当前实例已有的name、age属性值,旧值会被直接清理,所以程序运行到最后内存里只剩最后一次赋值的Choi Jin Woo的信息,printAllDetails方法自然只能输出这一条记录。你之前每次设置完立刻打印能拿到对应结果,只是因为打印时还没执行下一次赋值操作覆盖旧值而已。
数组存储方案(推荐)
确实需要用数组(或集合容器)存储数据,但不是把多组值存在单个类的数组属性里,而是将每个注册人对应为一个独立的BASIC_GettersSetters实例,再把这些实例存入数组统一管理,和get、set方法的配合逻辑如下:
- 首先调整
BASIC_GettersSetters类的职责,让它仅存储单个注册人的信息,保留基础get、set方法,新增单个实例的信息打印方法即可:
public class BASIC_GettersSetters { private String name; private int age; // Getter方法 public String getName() { return name; } public int getAge() { return age; } // Setter方法 public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } // 打印当前注册人信息 public void printSingleDetail() { System.out.println("姓名:" + name + ",年龄:" + age); } }
- 外层创建实例数组,每次新建实例、调用set方法赋值后存入数组,最后遍历数组调用对应get方法或打印方法即可输出所有信息:
public class Test { public static void main(String[] args) { // 定义长度为3的数组存储3个注册人实例 BASIC_GettersSetters[] userList = new BASIC_GettersSetters[3]; // 录入第一个注册人 BASIC_GettersSetters user1 = new BASIC_GettersSetters(); user1.setName("Kim Min Ji"); user1.setAge(22); userList[0] = user1; // 录入第二个注册人 BASIC_GettersSetters user2 = new BASIC_GettersSetters(); user2.setName("Lee Seo Joon"); user2.setAge(27); userList[1] = user2; // 录入第三个注册人 BASIC_GettersSetters user3 = new BASIC_GettersSetters(); user3.setName("Choi Jin Woo"); user3.setAge(30); userList[2] = user3; // 打印所有注册人信息 for (BASIC_GettersSetters user : userList) { // 可直接调用打印方法 user.printSingleDetail(); // 也可以用get方法取值自行拼接输出 // System.out.println("姓名:" + user.getName() + ",年龄:" + user.getAge()); } } }
其他可行方案
- 用集合类替代数组:如果不确定注册人总数量,用
ArrayList<BASIC_GettersSetters>比数组更灵活,不需要提前指定长度,增删元素更方便,整体管理逻辑和数组一致。 - 单实例内置集合存储:如果一定要用同一个实例管理所有注册人数据,可以给
BASIC_GettersSetters类新增List<String> nameList、List<Integer> ageList两个集合属性,调用set方法时改为往集合里追加元素而非覆盖单个属性,printAllDetails方法遍历两个集合打印即可。但该写法不符合面向对象设计规范,后续扩展属性的成本很高,不推荐使用。
内容的提问来源于stack exchange,提问作者YN27
相关产品推荐
相关产品推荐

