今天突然發現一個之前一直被我忽略了的問題,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);//結果為 原字元串
}
}