JAVA 值傳遞與引用傳遞的幾種狀況

Java中數據類型分爲基本數據類型和引用數據類型,方法的參數分爲實際參數,和形式參數。數組

  • 形式參數:定義方法時寫的參數。
  • 實際參數:調用方法時寫的具體數值。

通常狀況下,在數據作爲參數傳遞的時候,基本數據類型是值傳遞,引用數據類型是引用傳遞(地址傳遞)。函數

一.值傳遞

 1     public static void main(String[] args) {  2         int a = 2;  3         int b = 3;  4  change(a,b);  5         System.out.println("a = " + a);  6         System.out.println("b = " + b);  7  }  8     public static void change(int a1,int b1) {  9         a1++;10         b1++;11         System.out.println("a = " + a1); 12         System.out.println("b = " + b1); 13     }

運行結果:this

1 a = 3
2 b = 4
3 a = 2
4 b = 3

流程:spa

1.主函數進棧,a、b初始化;code

2.調用change方法,change()進棧,將a和b的值,複製一份給a1和b1;對象

3.change方法中對a1和b1進行運算;blog

4.change方法彈棧;class

5.主函數彈棧;數據類型

緣由分析:引用

在change方法中,對a1和b1進行賦值,並不會影響到a、b,由於a一、b1中的值,只是從a、b中複製過來的,也就是a一、b1至關於a、b的副本,副本的內容不管怎麼修改,都不會影響到原件自己。

二.引用傳遞

1 public static void main(String[] args) { 2     int[] a = {1, 2, 3, 4, 5}; 3  change(a); 4     System.out.println(a[0]); 5 } 6 public static void change(int[] array) { 7     array[0] = 0; 8     System.out.println(array[0]); 9 }

運行結果

1 0
2 0

流程:

1.主函數進棧,int[] a初始化;

2.調用change方法,change()進棧,將a的地址值,複製一份給array;

3.change方法中,根據地址值,找到堆中的數組,並將第一個元素的值改成0。

4.change方法運行完畢,數組中第一個元素的值已經改變。

5.change方法彈棧;

6.主函數彈棧;

緣由分析:

調用change()方法時,形參array接收的是a地址值的副本。並在change方法中,經過地址值,對數組進行操做。change方法彈棧後,數組中的值已經改變。不管是主函數,仍是change方法,操做的都是同一地址值對應的數組。

三.String類型傳遞

1 public static void main(String[] args) { 2     String a = "123"; 3  change(a); 4  System.out.println(a); 5 } 6 public static void change(String a1) { 7     a1 = "321"; 8  System.out.println(a1); 9 }

運行結果是:

1 321
2 123

流程:

1.主函數進棧,a初始化;

2.調用change方法,change()進棧,將a的地址值,複製一份給a1;

3.change方法中,從新建立了一個String對象"321",並將a1指向了新的地址值;

4.change方法運行完畢,a1所指向的地址值已經改變;

5.change方法彈棧;

6.主函數彈棧;

緣由分析:

String對象作爲參數傳遞時,走的依然是引用傳遞,只不過String這個類比較特殊。

String對象一旦建立,內容不可更改。每一次內容的更改都是重現建立出來的新對象。

當change方法執行完畢時,a1所指向的地址值已經改變。而a1原本的地址值就是copy過來的副本,因此並不能改變a的值。

與String類型相似的狀況

 1 public class Test3 {  2 
 3     public static void main(String[] args) {  4         Person p = new Person("小明");  5  change(p);  6  System.out.println(p.name);  7  }  8     public static void change(Person p1) {  9         Person person = new Person("小紅"); 10         p1 = person; 11  System.out.println(p1.name); 12  } 13 } 14 class Person { 15  String name; 16     public Person(String name) { 17         this.name = name; 18  } 19 }

運行結果爲:

1 小紅 2 小明

總結:

  • 值傳遞的時候,將實參的值,複製一份給形參。
  • 引用傳遞的時候,將實參的地址值,複製一份給形參。
相關文章
相關標籤/搜索