Java 值傳遞 or 引用傳遞?

先說結論

java中方法參數(shù)傳遞方式是按值傳遞。
如果參數(shù)是基本類型,傳遞的是基本類型的字面量值的拷貝。
如果參數(shù)是引用類型,傳遞的是該參量所引用的對象在堆中地址值的拷貝。

再來舉例說明

基本類型作為參數(shù)傳遞

public static void main(String[] args) {
    //基本類型作為參數(shù)傳遞
    int num = 2;
    System.out.println("before change , num = " + num);
    changeData(num);
    System.out.println("after change , num = " + num);
}
public static void changeData(int num) {
    num = 10;
}

輸出結果為

before change , num = 2
after change , num = 2

通過這個例子,說明基本數(shù)據(jù)類型作為參數(shù)傳遞時,傳遞的是值得拷貝,無論怎么改變這個拷貝,原值是不會改變的。

對象作為參數(shù)傳遞

public static void main(String[] args) {    
    //對象作為參數(shù)傳遞
    A a = new A("hello");
    System.out.println("before change , a.str = " + a.str);
    changeData(a);
    System.out.println("after change , a.str = " + a.str);
}

public static void changeData(A a) {
    a.str = "hi";
}

class A {
    public String str;
    public A(String str) {
        this.str = str;
    }
}

輸出結果為

before change , a.str = hello
after change , a.str = hi

從結果來看,對象a被改變了,那么是不是調用changeData方法時,傳入的就是a對象本身呢?
答案是否定的。
下面我們進行分析,程序從main方法開始執(zhí)行,首先創(chuàng)建了一個A對象,并定義了一個a引用變量來指向A對象。


main方法中創(chuàng)建A對象后的存儲示意圖

接下來,調用changeData方法,a變量作為實參傳入changeData方法,賦值給changeData方法里的形參,從而完成changeData方法的a形參的初始化。

a傳入changeData方法后的存儲示意圖

從上圖可以看出,這種參數(shù)傳遞方式也是值傳遞,將main方法中a的副本傳入changeData方法,a是一個引用變量,所以并未復制A對象。
那么,當執(zhí)行changeData方法時,由于a只是一個引用變量,所以實際操作的還是堆內存中的A對象。因此,不管是操作main中的a,還是操作changeData方法中的a,實際操作的都是堆內存中的A對象,是同一個對象。
所以,當changeData方法中改變了a變量引用的A對象的str值后,main方法中a變量所引用的A對象的str值也被改變了。


TODO

下面程序的輸出結果是什么?

public class JavaDemo {

    public static void main(String[] args) {
        
        String str = new String("ada");
        char[] ch = { 'a', 'b', 'c' };

        change(str,ch);

        System.out.print(str +" and ");
        System.out.print(ch);
    }


    public static void change(String str, char ch[]) {
        str = "ada 111";
        ch[0] = 'd';
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,753評論 18 399
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,686評論 1 51
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,628評論 30 472
  • 舍得的本質所在——平衡。 易經上言:陰陽和則生;陰陽離則滅;陰陽平則佳。把握陰陽,統(tǒng)御整體。萬物因平衡而在,因打破...
    小吳橋閱讀 1,073評論 2 5
  • 先普及一下插件的安裝方法: 1.Android studio File->Settings..->Plugins–...
    黃海佳閱讀 553評論 0 1

友情鏈接更多精彩內容