Java中对象方法赋值给变量后值不更新的原因探究
为什么修改对象属性后,已赋值的String变量不会自动更新?
这是Java变量赋值的本质导致的,核心原因在于String是不可变对象,且变量存储的是对象的引用(或值),赋值操作是一次性的拷贝,不会建立动态关联。
具体拆解:
- 当你执行
String one = n.getPhraseX();时,getPhraseX()返回的是当时N类中PhraseX指向的字符串对象的引用,这个引用被拷贝到了变量one里。此时one和PhraseX各自保存着同一个字符串对象的地址,但两者之间没有任何绑定关系。 - 当你通过setter修改PhraseX时,本质是让PhraseX指向了一个新的字符串对象(因为String不可变,修改其实是创建新对象)。但
one变量里的引用还是原来那个旧对象的地址,自然不会同步更新。 - 只有重新执行
one = n.getPhraseX();,才会把PhraseX现在指向的新对象的引用拷贝给one,此时one才会指向最新的字符串。
完整代码示例:
class N { private String phraseX; public N() { // 初始值 this.phraseX = "旧内容"; } public String getPhraseX() { return phraseX; } public void setPhraseX(String phraseX) { this.phraseX = phraseX; } } class Main { public static void main(String[] args) { N n = new N(); String one = n.getPhraseX(); System.out.println(one); // 输出:旧内容 // 修改PhraseX的值 n.setPhraseX("新内容"); System.out.println(one); // 仍输出:旧内容,因为one保存的是旧对象的引用 // 重新赋值后获取新值 one = n.getPhraseX(); System.out.println(one); // 输出:新内容 } }
解决思路:
如果想随时获取最新的PhraseX值,有两种常见方式:
- 每次需要使用时直接调用
n.getPhraseX(),而非赋值给固定变量; - 把
one封装成方法,内部返回n.getPhraseX(),比如:
之后每次调用private static String getOne(N n) { return n.getPhraseX(); }getOne(n)就能拿到最新值。
内容的提问来源于stack exchange,提问作者droid
相关产品推荐
相关产品推荐

