四、java中的參數(shù)傳遞問題

一、先下結(jié)論:

基本類型作為參數(shù)傳遞時,是傳遞值的拷貝,無論你怎么改變這個拷貝,原值是不會改變的;在Java中對象作為參數(shù)傳遞時,是把對象在內(nèi)存中的地址拷貝了一份傳給了參數(shù),而不是把引用本身傳進去。

二、基本數(shù)據(jù)類型的傳遞實例:

2.1、實例一
public class Test1 {

       public static void main(String[] args) {

        int n = 3;

        System.out.println("Before change, n = " + n);

        changeData(n);

        System.out.println("After changeData(n), n = " + n);

    }

      

       public static void changeData(int n) {

        n = 10;

    }

}

運行結(jié)果:


image.png
2.2、實例二
public class ParamTransfer {
     public int money;
        
        public void amethod(int i) {
            System.out.println("方法得到的i的值:" + i);
            i = i * 5;
            System.out.println("方法執(zhí)行語句i=i*5后i的值:" + i);
            System.out.println("money的值:" + this.money);
        }

        public static void main(String[] args) {
            ParamTransfer pt = new ParamTransfer();
            pt.money = 100;
            pt.amethod(pt.money);
        }
}

運行結(jié)果:


image.png
2.3、實例三
package ObjectRef;

public class ObjectRef {

    public static void mothed1(){
        int x=0;
        int y=1;
        switchValue(x,y);
        System.out.println("x="+x);
        System.out.println("y="+y);
    }
    static void switchValue(int a,int b){

        int c=a;
        a=b;
        b=c;
    }
        
    public static void main(String[] args) {
        mothed1();  
    }
}

運行結(jié)果:


image.png

三、引用類型的參數(shù)傳遞

3.1、實例一:貌似是按引用傳遞的實例
package ObjectRef;

public class Test2 {

    public static void main(String[] args) {

     StringBuffer sb = new StringBuffer("Hello ");

     System.out.println("Before change, sb = " + sb);

     changeData(sb);

     System.out.println("After changeData(n), sb = " + sb);

 }
 

    public static void changeData(StringBuffer strBuf) {

     strBuf.append("World!");

 }

}

運行結(jié)果:


image.png

從結(jié)果來看,sb的值被改變了,那么是不是可以說:對象作為參數(shù)傳遞時,是把對象的引用傳遞過去,如果引用在方法內(nèi)被改變了,那么原對象也跟著改變。從上面例子的輸出結(jié)果來看,這樣解釋是合理。

3.2、反駁上面的例子
package ObjectRef;

public class Test3 {

    public static void main(String[] args) {

     StringBuffer sb = new StringBuffer("Hello ");

     System.out.println("Before change, sb = " + sb);

     changeData(sb);

     System.out.println("After changeData(n), sb = " + sb);

 }

   

    public static void changeData(StringBuffer strBuf) {

        strBuf = new StringBuffer("Hi ");

        strBuf.append("World!");

 }

}

按照上面例子的經(jīng)驗:對象作為參數(shù)傳遞時,是把對象的引用傳遞過去,如果引用在方法內(nèi)被改變了,那么原對象也跟著改變。你會認為應該輸出:

Before change, sb = Hello

After changeData(n), sb = Hi World!
但是實際是:
運行結(jié)果:


image.png

分析:


image.png

image.png

image.png

image.png

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 3,144評論 2 9
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,680評論 1 51
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,666評論 1 32
  • 3. 類設計者工具 3.1 拷貝控制 五種函數(shù)拷貝構(gòu)造函數(shù)拷貝賦值運算符移動構(gòu)造函數(shù)移動賦值運算符析構(gòu)函數(shù)拷貝和移...
    王偵閱讀 2,074評論 0 1
  • 第一 項目中出現(xiàn)的問題 -遷移到as上的奇怪錯誤 現(xiàn)在想必應該是只有少數(shù)的老項目因為維護成本的原因,還停留在ec...
    deyson閱讀 399評論 0 1

友情鏈接更多精彩內(nèi)容