程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> 字符串-java中String究竟是傳遞的值,還是引用

字符串-java中String究竟是傳遞的值,還是引用

編輯:編程綜合問答
java中String究竟是傳遞的值,還是引用

很多人說,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++的程序調用,都是基於棧機制的,所以在函數調用時,都是有明確的參數值入棧的,這時的引用參數應該是傳的地址,所有的引用類型變量在編譯時都由編譯器改成了指針類型的操作。所以說引用是語法糖。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved