Java中swap解惑


        直接上代碼……

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);
    } 
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM