1, 值傳遞和引用傳遞在java中是傳遞的引用,在傳遞參數到方法的時候,都會拷貝一個引用的副本,在方法內部,如果在方法內部改變是副本的內存指向, 那原來的變量是不會發生改變的,如果改變的是指向地址的值,那原對象就會發生改變。
public class StringTest { public static void main(String[] args) { String str = "java"; nochange(str, str); change(str, str); } public static void nochange(String str1,String str2) { System.out.println("nochange--->>"+(str1 == str2)); } public static void change(String str1,String str2) { str1 = str1 + ""; System.out.println("change--->>"+(str1 == str2)); } } 結果: nochange--->>true change--->>false
網上引用:
很多人說,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並沒有什麼特殊性,和其他類一樣,同樣保存的對象的引用,傳遞的引用。唯一的特殊性,就是可以直接用“”雙引號的方式創建字符串對象。
2, android中多線程, 多進程之間的通信?