一般來說,java裡面A類調用B類的方法,並傳遞參數X()類型,因為通常實參是一個對象的引用,所以在B類的方法中修改傳來的參數,在A類的原型也會發生變化。但我試過當實參為String類型時,在B類修改傳入參數不會對A類的原型產生影響。為什麼?
public void Test1(){
String b = "123";
change(b);
System.out.println(b);//tom
}
void change(String s)
{
s += "456"
}
上面的代碼,你是不是認為"123"變為了"123456"了呢?
其實沒有。調用change(b)時,將引用類型b的值的一個副本(假設是b1)傳入方法
執行 b1 += "456",其實是讓b1指向了在內存中創建的一個新對象"123456",放入字符串緩沖池。
原來的b值沒變,原來的b值指向的"123"也沒變,依舊是b="123"
記住Java傳的是值和字符串對象一旦創建就不可改變,這個問題就好理解了。
如果可以,去看看對象和對象引用在內存中的存儲方式,你可能會對這個問題理解得更透徹
public class Person{
public String name;
public Person(String name){
this.name=name;
}
}
public void Test2(){
Person p=new Person("tom");
changePerson(p);
System.out.println(p.name);//tom
}
void changePerson(Person p)
{
p = new Person("tom2");
}
輸出依然是tom,將引用類型p的值的一個副本(假設是p1)傳入方法,
執行 p1 = new Person("tom2"),其實是讓p1指向了一個新的對象tom2。
如果這樣寫
public void Test2(){
Person p=new Person("tom");
changePerson(p);
System.out.println(p.name);//tom
}
void changePerson(Person p)
{
p.name=("tom2");
}
輸出則是tom2,將引用類型p的值的一個副本(假設是p1)傳入方法,
執行 p1.name=("tom2"),其實是讓p1指向的對象tom的名字改為tom2