很多人說,java中的String雖然是對象,但是具有值類型的特征。他是值傳遞,傳遞的值。
我認為這這種說法完全是錯誤的。
String和普通對象毫無區別,和其他對象一樣,傳遞的是引用,而不是值。
一段String的運用代碼:
String a = "123";
public void change(String a){
a = "234";
}
很多人會說,a的值沒有變,是因為String是值傳遞,問題是,就算對於一個普通對象,這樣的用法,該對象的值也是不會改變的!這是一個大大的誤區。java中根本沒有真正的引用傳遞,不想C#中有ref關鍵字!
比如:
Person p = new Person("張三");
public void change(Person p){
p = new Person("李四");
}
上面對於String的使用和這個自定義Person類的使用上,根本沒有本質上的區別。同樣,外面的p變量依然是”張三”,不會是“李四。”
同樣的代碼,放入C#中,加上ref關鍵字:
Person p = new Person("張三");
public void Change(ref Person p){
p = new Person("李四");
}
結果是,p變為了“張三”!
所以說,個人認為java中的String並沒有什麼特殊性,和其他類一樣,同樣保存的對象的引用,傳遞的引用。唯一的特殊性,就是可以直接用“”雙引號的方式創建字符串對象。
java 傳參都是傳的值,這點就現在的java而言毫無疑問。
但是java的變量在方法中一般來說有2種類型:基本類型與對象(通常這個對象是引用類型),基本類型保存在棧區,對象保存在堆區
至於C# 的public void Change(ref Person p)或者c++的public void Change(Person& p)就語法角度來講,確實是引用。雖然沒有研究,但是覺得,這只是語法糖而已。因為無論c#或者C++的程序調用,都是基於棧機制的,所以在函數調用時,都是有明確的參數值入棧的,這時的引用參數應該是傳的地址,所有的引用類型變量在編譯時都由編譯器改成了指針類型的操作。所以說引用是語法糖。