Java中调用Sailor类setEmail方法后邮箱未修改问题求助
问题:调用setEmail方法后邮箱未变更的排查与解决
我在Sailor类中实现了setEmail方法,期望在main类中调用该方法修改邮箱,但调用后邮箱并未发生变更。尝试修改setter逻辑、调整Crew类的toString方法,均未解决问题,求解决思路。
代码示例
import java.util.ArrayList; class Sailor { private String name; private String email; public Sailor(String name, String email) { this.email = email; this.name = name; } public String getName() { return this.name; } public String getEmail() { return this.email; } public void setEmail(String email) { this.email = email; } } class Crew { ArrayList<Sailor> sailorList = new ArrayList<>(); public Crew() {} public void addCrewMember(Sailor sailor) { sailorList.add(new Sailor(sailor.getName(), sailor.getEmail())); } public String toString() { String content = ""; for (int i = 0; i < sailorList.size(); i++) { content += sailorList.get(i).getName() + " ("; content += sailorList.get(i).getEmail() + ") \n"; } return content; } } class ObjectsCrewProgram { public static void main(String[] args) { Sailor firstSailor = new Sailor("Frank", "frank@mail.com"); Sailor secondSailor = new Sailor("Susan", "susan@mail.com"); Sailor thirdSailor = new Sailor("John", "john@sailors.com"); Sailor fourthSailor = new Sailor("Ann", "ann@sailors.com"); Crew firstCrew = new Crew(); Crew secondCrew = new Crew(); firstCrew.addCrewMember(firstSailor); firstCrew.addCrewMember(secondSailor); firstCrew.addCrewMember(fourthSailor); secondCrew.addCrewMember(thirdSailor); secondCrew.addCrewMember(secondSailor); System.out.println("=== First crew ===\n" + firstCrew); System.out.println("=== Second crew ===\n" + secondCrew); secondSailor.setEmail("Susan@sailors.com"); System.out.println("===Second crew ===\n" + secondCrew); } }
问题根源
问题出在Crew类的addCrewMember方法里:
你没有直接把传入的sailor对象加入列表,而是新建了一个完全独立的Sailor实例,只复制了原对象的name和email值。这导致:
- main方法里的
secondSailor、firstCrew里的"Susan"、secondCrew里的"Susan"是三个毫不相关的对象 - 调用
secondSailor.setEmail()只会修改main里那个对象的邮箱,完全影响不到Crew列表里的两个副本
解决方法
直接修改addCrewMember方法,把传入的原对象添加到列表中即可:
public void addCrewMember(Sailor sailor) { sailorList.add(sailor); }
这样Crew列表里保存的是原对象的引用,当你调用setEmail修改原对象时,列表里的对象会同步更新——因为它们指向内存中的同一个实例。
额外说明
如果你的业务逻辑确实需要在Crew中保存原对象的独立副本(比如防止外部修改影响内部数据),可以采用以下两种方式:
- 在修改原对象后,手动遍历Crew列表,找到对应的副本并更新其邮箱;
- 给Sailor类实现
clone()方法,在需要同步时主动更新副本数据。
内容的提问来源于stack exchange,提问作者Enerqia
相关产品推荐
相关产品推荐

