直接上代碼……
public class Swap { public static void main(String[] args) { int a[] = new int[]{1,2}; System.out.println(a[0] + " "+a[1]); swap(a,0,1); System.out.println(a[0] + " "+a[1]); } private static void swap(int[] a, int i, int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } }
方法調用(call by) 是一個標准的計算機科學術語,方法調用根據參數傳遞的情況又分為值調用( call by reference ) 和引用調用( call by value ) 。江湖上有很多關於這兩種調用的定義 ,最通常的說法是傳遞值的是值調用,傳遞地址的是引用調用。這其實很不恰當,這種 這些說法很容易讓我們聯想到Java的對象參數傳遞是引用調用,實際上,Java的對象參數傳遞仍然是值調用 。 在main里輸出還是原來的2、3,不管傳遞的是引用類型還是對象實例。
public class Swap1 { public static void main(String[] args) { Integer a=new Integer(2); Integer b=new Integer(3); TestSwap ts=new TestSwap(a,b); System.out.println("before swap:"); ts.outPut(); ts.dataSwap1(a,b); System.out.println("after swap:"); ts.outPut(); } } class TestSwap { Integer a=null; Integer b=null; public TestSwap(Integer a,Integer b) { this.a=a; this.b=b; } /*這樣不可交換,交換的只是拷貝過來的引用,而 * 輸出還是成員變量(輸出用的是類內的方法) * 重要的是,形參和實參所占的內存地址並不一樣, * 形參中的內容只是實參中存儲的對象引用的一份拷貝。 * */ protected void dataSwap0(Integer a,Integer b) { Integer temp=a; a=b; b=temp; } protected void dataSwap(Integer a,Integer b) { this.a = b; this.b = a; } //這樣也可以,不過需要類內的輸出,就是說輸出TestSwap的成員變量 protected void dataSwap1(Integer a,Integer b) { Integer temp=this.a; this.a=this.b; this.b=temp; } protected void outPut() { System.out.println("a="+a+" b="+b); } }
