java參數傳遞機制總結

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:以上是自己總結的,如有不對之處,敬請指正!









發佈了42 篇原創文章 · 獲贊 135 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章