1.形參:用來接收調用該方法時傳遞的參數。只有在被調用的時候才分配內存空間,一旦調用結束,就釋放內存空間。因此僅僅在方法內有效。
1 public void swap(int a, int b) { 2 int temp = a; 3 a = b; 4 b = temp; 5 System.out.println("a:" + a + " b:" + b); 6 } 7
8 這里邊的a,b就是形參,temp是一個局部變量,方法結束,在棧空間中就會被銷毀
2.實參:傳遞給被調用方法的值,預先創建並賦予確定值。
1 調用上面的 2 swap(1,2); 3 其中1和2就是實際的參數值,就叫實參
3.傳值調用:傳值調用中傳遞的參數為基本數據類型,參數視為形參。
1 public class TestArgsTransform { 2 public static void main(String[] args) { 3 int i = 10; 4 int j = 5; 5 TestArgsTransform tt = new TestArgsTransform(); 6 System.out.println("i:" + i + " j:" + j); 7 tt.swap(i, j); 8 System.out.println("i:" + i + " j:" + j); 9
10
11 } 12
13 public void swap(int a, int b) { 14 int temp = a; 15 a = b; 16 b = temp; 17 System.out.println("a:" + a + " b:" + b); 18 } 19
20
21 } 22 這里我們寫了一個基本的數據類型,實現兩個int型數據交換的方法,並且在main()方法中調用,然而結果卻並不是我們想要的
運行結果如下圖所示:

就是因為基本數據類型是屬於傳值調用,當我們要實現交換時,方法內可以完成交換,只是實參進行了交換,方法結束,棧空間中就會銷毀swap()方法內的局部變量,所以當調用swap()時,最終值還是實參的初始化值,並沒有被修改。值改變作用到了形參,而不會到實參
4.傳引用調用:傳引用調用中,如果傳遞的參數是引用數據類型,參數視為實參。在調用的過程中,將實參的地址傳遞給了形參,形參上的改變都發生在實參上。
1 package com.argstransform; 2 //參數傳遞: 3 //形參:方法聲明時,方法小括號內的參數 4 //實參: 調用方法時,實際傳入的參數值 5 6 //java中傳遞值得機制: 7 //形參是基本數據類型的: 將實參的值傳遞給實參的基本數據類型的變量 8 //形參是引用數據類型的: 將實參的引用類型的值(即在堆空間中生成的首地址的值)傳遞給形參的引用類型的變量 9 10 public class TestDemo1 { 11 public static void main(String[] args) { 12 TestDemo1 td = new TestDemo1(); 13 Data data = new Data(); 14 System.out.println("data.i:"+data.i+" data.j:"+data.j); 15 //調用 16 td.swap(data); 17 System.out.println("data.i:"+data.i+" data.j:"+data.j); 18 19 } 20 21 public void swap(Data data) { 22 int temp = data.i; 23 data.i = data.j; 24 data.j = temp; 25 } 26 } 27 28 class Data { 29 int i = 10; 30 int j = 5; 31 }
//形參部分直接傳進去了一個對象,相當於堆空間的首地址值得引用
運行結果:

總結:
1.java的基本數據類型是傳值調用,對象引用類型是傳引用。
2.當傳值調用時,改變的是形參的值,並沒有改變實參的值,實參的值可以傳遞給形參,但是,這個傳遞是單向的,形參不能傳遞回實參。
3.當引用調用時,如果參數是對象,無論對對象做了何種操作,都不會改變實參對象的引用,但是如果改變了對象的內容,就會改變實參對象的內容。
