實習第二天-java參數傳遞-精華在文章最後2句話

來源:互聯網
上載者:User

標籤:對象   sys   基本   爭論   方法   round   操作   參數   做什麼   

對於基本類型的傳遞,我們很容易理解,而對於對象,總讓人感覺是按引用傳遞,看下面的程式:

public class ObjectRef { //基本類型的參數傳遞

    public static void testBasicType(int m) {

        System.out.println("m=" + m);//m=50

        m = 100;

        System.out.println("m=" + m);//m=100

    }

    //參數為對象,不改變引用的值 ??????

    public static void add(StringBuffer s) {  //change方法

        s.append("_add");

    }

test類裡面的:

————————————————————————————————————————————

   StringBuffer sMain = new StringBuffer("init");

        System.out.println("sMain=" + sMain.toString());//sMain=init

        add(sMain); 

System.out.println("sMain=" + sMain.toString());//sMain=init_add

//傳遞進去引用變數;相當於C++中引用傳遞一樣,被呼叫者法裡面改變了,外面也相應地改變了

        changeRef(sMain);

        System.out.println("sMain=" + sMain.toString());//sMain=init_add

——————————————————————————————————————————————————

    //參數為對象,改變引用的值 ?????

    public static void changeRef(StringBuffer s) { //changeRef方法

        s = new StringBuffer("Java");

    }

   

    public static void main(String[] args) {

        int i = 50;

        testBasicType(i);

        System.out.println(i);//i=50

        StringBuffer sMain = new StringBuffer("init");

        System.out.println("sMain=" + sMain.toString());//sMain=init

        add(sMain);

        System.out.println("sMain=" + sMain.toString());//sMain=init_add

        changeRef(sMain);

        System.out.println("sMain=" + sMain.toString());//sMain=init_add

    }

}

以上程式的允許結果顯示出,testBasicType方法的參數是基本類型,儘管參數m的值發生改變,但並不影響i。

      add方法的參數是一個對象,當把sMain傳給參數s時,s得到的是sMain的拷貝,所以s和sMain指向同一個對象,因此,使用s操作影響的其實就是sMain指向的對象,故調用add方法後,sMain指向的對象的內容發生了改變。(好好好)

      在changeRef方法中,參數也是對象,當把sMain傳給參數s時,s得到的是sMain的拷貝,但與add方法不同的是,在方法體內改變了s指向的對象(也就是s指向了別的對象,牽著氣球的繩子換氣球了),

給s重新賦值後,s與sMain已經毫無關聯,(兩個有了不同的指向)它和sMain指向了不同的對象,所以不管對s做什麼操作,都不會影響sMain指向的對象,故調用changeRef方法前後sMain指向的對象內容並未發生改變。

(精華精華精華上面那句話)

 

對於add方法的調用結果,可能很多人會有這種感覺:這不明明是按引用傳遞嗎?對於這種問題,還是套用Bruce Eckel的話:這依賴於你如何看待引用,最終你會明白,這個爭論並沒那麼重要。真正重要的是,你要理解,傳引用使得(調用者的)對象的修改變得不可預期。

 

實習第二天-java參數傳遞-精華在文章最後2句話

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.