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方法,操做的都是同一地址值對應的數組。
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的值。
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 小明