2017-10-12 89 views
0

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

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

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

+4

字符串*是不可变的*。你可以通过使用可变对象来实现这一点。对于字符串,你可以使用反射做到这一点(不建议通过) – TheLostMind

+0

@TheLostMind我基本上试图做到这一点,我自己的数据结构在一个较大的项目。我怎么能确保我的DS是可变的? –

+2

除了字符串的不变性之外,通过执行't = new String(“b”);'给t赋一个完整的新实例。这不会覆盖该值,即使您使用可变对象也不会。 – Korashen

回答

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" 
1

不,它从来没有像那样工作。变量,字段等不能在Java中“绑定”。

您的变量可以在变量中包含“指向值的链接”,但不能有“指向其他变量的链接”。

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

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; 
    } 
} 

(你可以用new StringWrapper("a")更换新StringWrapper(new String("a"))我添加new String所以它看起来更像你的例子也是一样的。 new String("b")。)

相关问题