Java使用构造器与get方法跨类传值仅返回默认值问题咨询
问题原因
你在Cast类内部通过Location L = new Location();自行创建了一个全新的Location实例,这个实例和main方法中创建的Location实例L是两个完全独立、互不关联的对象。你在main方法中修改的是main作用域下的L的属性,Cast内部持有的Location实例从未被修改,一直保留构造器初始化的默认值HOME,因此调用setLoc()取值时只会拿到默认值。
修复方案
核心思路是让Cast持有外部传入的Location实例引用,而非自行创建新实例,修改代码如下:
- 修改
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; } }
- 修改
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
相关产品推荐
相关产品推荐

