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

Java使用构造器与get方法跨类传值仅返回默认值问题咨询

问题原因

你在Cast类内部通过Location L = new Location();自行创建了一个全新的Location实例,这个实例和main方法中创建的Location实例L是两个完全独立、互不关联的对象。你在main方法中修改的是main作用域下的L的属性,Cast内部持有的Location实例从未被修改,一直保留构造器初始化的默认值HOME,因此调用setLoc()取值时只会拿到默认值。

修复方案

核心思路是让Cast持有外部传入的Location实例引用,而非自行创建新实例,修改代码如下:

  1. 修改Cast类的结构,新增构造参数接收外部Location实例:
public class Cast {
    // 持有外部传入的Location实例引用,不自行创建
    private Location locationInstance;
    private String location;

    // 构造方法新增参数,接收外部创建好的Location实例
    public Cast(Location loc){
        this.locationInstance = loc;
        this.location = "";
    }

    public void setLoc(){
        this.location = locationInstance.getLocation();
    }

    public String getLoc(){
        return location;
    }
}
  1. 修改main方法中Cast实例的实例化逻辑,将main中创建的Location实例传入:
public static void main(String[] args) {
    Location L = new Location();
    // 将外部的Location实例传入Cast构造器
    Cast C = new Cast(L);

    L.setLocation("BEACH");
    System.out.println(L.getLocation()); // 输出BEACH

    C.setLoc();
    System.out.println(C.getLoc()); // 此时会正确输出BEACH
}

可选优化(实现自动同步)

如果不需要手动调用setLoc()触发同步,可以删掉Cast类中的location缓存变量,直接读取Location实例的最新值:

public class Cast {
    private Location locationInstance;

    public Cast(Location loc){
        this.locationInstance = loc;
    }

    // 直接返回最新的Location值,不需要手动调用setLoc更新
    public String getLoc(){
        return locationInstance.getLocation();
    }
}
补充问题解答

Location类getLocation方法中的toString()调用不会对结果产生任何影响。因为location属性本身就是String类型,String的toString()方法返回的就是对象自身,和直接返回location的效果完全一致,本次问题和该写法无关。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:45:03