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

Java中修改类实例属性时如何让关联的其他类实例属性同步更新

你的问题本质是值拷贝和引用存储的差异:你当前在Info_C类中单独声明了name、company两个属性,构造方法执行时只是把传入的Info实例的对应属性的值复制到了Info_C的自有属性里,相当于存了一份属性快照,后续原Info实例的属性修改不会影响这份已经拷贝好的值,自然不会同步。

修复方案

直接修改Info_C的存储逻辑,不单独拷贝name、company属性,而是直接存储关联的Info对象的引用,每次需要取人员基础信息时直接从关联的Info实例中读取即可,无需额外维护副本。

第一步:给Info类添加属性Getter方法

方便外部类读取Info的属性,也符合Java封装规范:

public class Info {
    String name;
    String company;
    
    Info(String n, String c) {
        name = n;
        company = c; 
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setCompany(String company) {
        this.company = company;
    }
    // 新增Getter方法
    public String getName() {
        return name;
    }
    public String getCompany() {
        return company;
    }
    
    public String toString() {
        return this.name + ". working at " + this.company;
    }
}

第二步:修改Info_C类的结构

删除冗余的name、company属性,改为存储Info引用:

public class Info_C {
    String position;
    String dept;
    // 直接存储关联的Info对象引用,替代冗余的属性拷贝
    private Info info;
    
    Info_C(Info i, String p, String d) {
        this.info = i;
        position = p;
        dept = d;
    }
    public void setInfo(Info i) {
        this.info = i;
    }
    public void setPosition(String p) {
        this.position = p;
    }
    
    public String toString() {
        // 直接从关联的Info实例读取最新的属性值
        return this.info.getName() + ". Working as a " +this.position + " in " + this.info.getCompany() + "'s " + this.dept;
    }

    // main方法不需要修改
    public static void main(String[] args) {
        var Pf_B = new Info("Bob","Apple");
        var Pf_J = new Info("James","Google");
        
        var TM = new Info_C(Pf_B, "Team Manager","Sales Team1");
        var AM = new Info_C(Pf_B, "Assistane Manager","HR Team");
        var RE = new Info_C(Pf_B, "Research Engineer","R&D Team");
        
        System.out.println(Pf_B); // Bob. working at Apple
        System.out.println(Pf_J); // James. working at Google
        System.out.println(TM);   // Bob. Working as a Team Manager in Apple's Sales Team1
        System.out.println(AM);   // Bob. Working as a Assistane Manager in Apple's HR Team
        System.out.println(RE);   // Bob. Working as a Research Engineer in Apple's R&D Team
        
        Pf_B.setName("Eric");
        Pf_B.setCompany("Samsung");
        AM.setPosition("Team Manager");
        RE.setInfo(Pf_J);
        
        System.out.println("=========================Changed==========================");
        
        System.out.println(Pf_B); // Eric. working at Samsung
        System.out.println(TM);   // 输出变为 Eric. Working as a Team Manager in Samsung's Sales Team1
        System.out.println(AM);   // 输出变为 Eric. Working as a Team Manager in Samsung's HR Team
        System.out.println(RE);   // James. Working as a Research Engineer in Google's R&D Team
    }
}

修改完成后运行代码,所有关联同一个Info实例的Info_C实例都会自动读取到最新的属性值,实现自动同步。
另外你的问题标题可以修改为《Java中修改基础信息实例属性后,关联的扩展信息实例属性如何自动同步》,更贴合问题场景。

内容的提问来源于stack exchange,提问作者love Croquembouch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:27:02