You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:09:31