我正在嘗試在Java中爲對象變量創建一個別名,以便我可以更改一個並使其影響另一個。例如,在這個片段中,我希望打印出「b」。相反,我得到「一個」。如何讓兩個對象變量互相引用?
String s = new String("a");
String t = s;
t = new String("b");
System.out.println(s); // Prints "a".
我認爲Java中的非原始類型能夠被引用並像這樣「捆綁」在一起。
我正在嘗試在Java中爲對象變量創建一個別名,以便我可以更改一個並使其影響另一個。例如,在這個片段中,我希望打印出「b」。相反,我得到「一個」。如何讓兩個對象變量互相引用?
String s = new String("a");
String t = s;
t = new String("b");
System.out.println(s); // Prints "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
仍引用舊值)。這只是在`噸
你可能會尋找像這樣的參考:
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")
。)
字符串*是不可變的*。你可以通過使用可變對象來實現這一點。對於字符串,你可以使用反射做到這一點(不建議通過) – TheLostMind
@TheLostMind我基本上試圖做到這一點,我自己的數據結構在一個較大的項目。我怎麼能確保我的DS是可變的? –
除了字符串的不變性之外,通過執行't = new String(「b」);'給t賦一個完整的新實例。這不會覆蓋該值,即使您使用可變對象也不會。 – Korashen