天天看點

java語言中方法的參數傳遞

    今天突然發現一個之前一直被我忽略了的問題,java方法的參數傳遞問題。之前隻知道給方法傳遞實參時是傳遞變量的副本,在方法中改變參數的值時實際變量的值不受影響。其實,傳遞實參時分三種情況:

一、基本資料類型(數值類型、布爾類型)

    基本資料類型在傳遞參數時是值傳遞,即将變量的值傳遞給形參,此時形參是一個與該變量值相同的資料,但不是同一個資料(可以看作是變量的副本),是以在方法中改變形參的值并不會影響實際變量的值。

public class A {
	public void jia(int a) {
		a++;
	}
	public static void main(String[] args) {
		int a=1;
		new A().jia(a);
		System.out.println(a);//結果為1
	}
}
           

    從上面程式可以看出實際變量a的值并沒有受到方法jia的影響。

二、引用資料類型

    将引用資料類型變量傳遞給形參,實際傳遞了變量中存放的記憶體位址。此時,形參變量和實際變量指向同一位址記憶體,在方法中改變形參變量的值時,有兩種情況:

    1)改變形參變量中存放的位址

    相當于将形參變量又指向别的記憶體區域,此時并不會影響實際變量中存放的位址值。

public class B {

	public void jia(int[] a) {
		int[] b=new int[] {100,200,300};
		a=b;
	}
	public static void main(String[] args) {
		int[] a=new int[] {1,2,3};
		new B().jia(a);
		System.out.println(a[0]+","+a[1]+","+a[2]);//結果是1,2,3
	}
}
           

    從上面程式可以看出,a變量仍指向原數組位址記憶體。

    2)改變形參指向的位址的内容

    調用了方法後,形參變量與實際變量指向同一塊記憶體區域,此時若在方法中改變該記憶體區域内容,實際變量指向記憶體區域同時被改變(因為是同一塊記憶體)

public class C {
	public void jia(int[] a) {
		a[0]++;
	}
	public static void main(String[] args) {
		int[] a=new int[] {1,2,3};
		new C().jia(a);
		System.out.println(a[0]);//結果為2
	}
}
           

    從上面程式可以看出,數組a的第0個值被改變。

三、不可變類(如String、八大包裝類)

    不可變類也是引用資料類型,在參數傳遞時仍然是将其中存放的位址傳給形參變量,但是不可變類對象的内容不可改變,一旦改變,就相當于建立了一個新的對象,并将改變後的内容賦給新對象,而原來的對象所在記憶體不會改變。

public class D {	
	public void jia(String a) {
		a=a+"字元串被改變了";
	}
	public static void main(String[] args) {
		String a="原字元串";
		new D().jia(a);
		System.out.println(a);//結果為 原字元串
	}
}