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

时间:2017-10-12 10:47:49

标签: java

我正在尝试在Java中为对象变量创建别名,以便我可以更改一个并使其影响另一个。例如,在此片段中,我希望打印出“b”。相反,我得到了“a”。

String s = new String("a");
String t = s;
t = new String("b");
System.out.println(s);    // Prints "a".

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

3 个答案:

答案 0 :(得分:1)

不,它永远不会那样。变量,字段等不能在Java中“绑定”。

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

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

中的参考

答案 1 :(得分:0)

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"

答案 2 :(得分:0)

你可能正在寻找这样的东西:

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(new String("a"))替换为new StringWrapper("a")。我添加了new String,因此它看起来更像您的示例。new String("b")也是如此。)