java語言的參數傳遞方式只有一種:值傳遞。值傳遞的意思就是,將實際參數的值的副本傳入方法中,而原參數的值不受任何影響。
一、基本數據類型:
如以下代碼:
public class Test {
public static void main(String[] args) {
Person person=new Person();
person.a=5;
person.b=10;
int x=5;
int y=10;
swap(x, y);
System.out.println("x="+x+" y="+y);
}
//交換x,y的值
public static void swap(int x, int y){
int temp;
temp=x;
x=y;
y=temp;
}
}
輸出結果:
由輸出結果可以看出,通過swap方法並不能改變原x,y的值。
二、引用類型:傳遞的是地址的副本
如以下代碼:
public class Test {
public static void main(String[] args) {
Person person=new Person();
person.a=5;
person.b=10;
swap(person);
System.out.println("person.a="+person.a+" person.b="+person.b);
}
//交換person.a與person.b的值
public static void swap(Person person1){
int temp;
temp=person1.a;
person1.a=person1.b;
person1.b=temp;
person1=null;
}
}
class Person{
public int a;
public int b;
}
輸出結果:
由輸出結果可以看出,執行完以後,即使在swap方法中最後將person1=null,兩個屬性的值還是被改變了。這很容易造成一種錯覺,不是java都是值傳遞嗎?不是說不會改變原來參數的值嗎,爲什麼最後還是交換了?因爲在這裏,person1只是person的複製器,也可以理解爲對於引用類型,傳進去的是地址的副本,person、person1同時指向同一個地址,所以能修改屬性的值。下面通過畫圖希望能夠幫助大家加深理解:
通過參數傳遞,person1與person指向同一個對象:
當person1=null時,相當於斷開person1對person對象的引用,但原先對person對象屬性的修改卻保留了下來:
打一個淺顯的比方,甲拿着自己房間的鑰匙複製了一把給乙。乙拿着複製的鑰匙打開了甲的房間,對甲房間裏面的佈置做了一些修改,然後乙的鑰匙丟了,但是對乙對甲房間的佈置修改卻會保留下來。
注:對於String,StringBuffer,也是一樣的,但是StringBuffer對象的append()方法卻可以改變原參數的值,原理跟以上是類似的。
總結:對於基本類型的參數傳遞,不會改變原參數的值;
對於引用類型的參輸傳遞,不會改變原參數對對象的引用,但是會修改原參數指向的對象的屬性的值。
PS:以上是自己總結的,如有不對之處,敬請指正!