Java 如何使两个对象变量相互引用?

Java 如何使两个对象变量相互引用?,java,Java,我试图在Java中为一个对象变量创建一个别名,这样我就可以更改其中一个并使它影响另一个。例如,在这段代码中,我希望打印出“b”。相反,我得到了“a” 我认为Java中的非原语类型可以像这样被引用和“绑定”在一起。String不是一个好例子,因为这是不可变的。您必须考虑使用对象实例和对象引用。一个对象实例可以有多个对象引用 class Decorator { private String str; public Decorator(String str) { th

我试图在Java中为一个对象变量创建一个别名,这样我就可以更改其中一个并使它影响另一个。例如,在这段代码中,我希望打印出“b”。相反,我得到了“a”


我认为Java中的非原语类型可以像这样被引用和“绑定”在一起。

String
不是一个好例子,因为这是不可变的。您必须考虑使用对象实例和对象引用。一个对象实例可以有多个对象引用

class Decorator {
    private String str;

    public Decorator(String str) {
        this.str = str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    public String getStr() {
        return str;
    }
}


Decorator s = new Decorator("a"); // s - is a reference to Decorator
System.out.println(s.getStr());  // prints "a"
Decorator t = s; // t - is an another reference to existed Decorator (two references for one instance)
t.setStr("b");
// references s and t both point to one Decorator instance
System.out.println(s.getStr());  // prints "b"
System.out.println(t.getStr());  // prints "b"

不,它从来不是这样工作的。变量、字段等不能在Java中“绑定”

变量中可以包含“指向值的链接”,但不能包含“指向另一个变量的链接”


这意味着在您的情况下,
s
t
最初持有指向相同值的链接,但它们彼此不了解。将新字符串指定给
t
时,旧字符串的值不会更改(并且
s
仍然引用旧值)。这只是't

中的参考,您可能正在寻找以下内容:

StringWrapper sw = new StringWrapper(new String("a"));
StringWrapper tw = sw;
tw.setS(new String("b"));
System.out.println(sw.getS()); // Prints b

class StringWrapper {
    private String s;
    public StringWrapper(String s) {
        this.s = s;
    }
    private String getS() {
        return s;
    }
    private void setS(String s) {
        this.s = s;
    }
}

(您可以将新的
StringWrapper(新字符串(“a”)
替换为
新的StringWrapper(“a”)
。我添加了
新字符串
,因此它看起来更像您的示例。
新字符串(“b”)

字符串也是不可变的。您可以通过使用可变对象来实现这一点。对于字符串,您可以使用反射来实现这一点(但不推荐)@TheLost Mind我基本上是在一个更大的项目中尝试对我自己的数据结构实现这一点。我怎样才能确保我的DS是可变的呢?除了字符串的不变性之外,通过执行
t=newstring(“b”)将一个全新的实例分配给t。这不会覆盖该值,即使您使用的是可变对象也是如此。对于问题本身,请查看
facade
proxy
Delegate
设计模式。或者,
可观察的
正是您所需要的?这会打印出
一个
,这并不奇怪,因为您从未重新分配
s
变量。如果要执行
s=新字符串(“b”),它确实会打印
b
StringWrapper sw = new StringWrapper(new String("a"));
StringWrapper tw = sw;
tw.setS(new String("b"));
System.out.println(sw.getS()); // Prints b

class StringWrapper {
    private String s;
    public StringWrapper(String s) {
        this.s = s;
    }
    private String getS() {
        return s;
    }
    private void setS(String s) {
        this.s = s;
    }
}