Java的值傳遞

??對值傳遞、引用傳遞有些疑問,綜合其他人的解釋,加上自己的理解,在這里分享一下,如有不當之處,懇請指出。

1、概念

??值傳遞、引用傳遞,是計算機領域的專有名詞。
??值傳遞和引用傳遞,屬于函數調用時參數的求值策略(Evaluation Strategy),這是對調用函數時,求值和傳值的方式的描述,而非傳遞的內容的類型(內容指:是值類型還是引用類型,是值還是指針)。(參考:鏈接:https://www.zhihu.com/question/31203609/answer/112157038作者:Yolanda。著作權歸作者所有。商業(yè)轉載請聯系作者獲得授權,非商業(yè)轉載請注明出處。)
??值傳遞和引用傳遞,和Java概念里的值類型(基本數據類型)、引用類型(String、數組等)沒有任何聯系,這一點比較容易混淆。值類型/引用類型,是用于區(qū)分兩種內存分配方式,值類型在調用棧上分配,引用類型在堆上分配。一個描述內存分配方式,一個描述參數求值策略,兩者之間無任何依賴或約束關系。

2、為什么Java中的是值傳遞

image.png

2.1例一(參數為基本數據類型)

  public static void main(String[] args) {
         int i = 0;
        //傳一個值類型(基本數據類型)
        test1(i);
        System.out.println("i="+i);
        //結果:i=0
    }
    /**
     * 函數一
     * @param param
     */
    public static void test1(int param) {
        //  摔了一跤
        param = 1;
    }

??例一中,param存儲的是拷貝傳入變量的值,而不是地址。打個比方,我(變量i)有一杯水(i=0),你(test1函數)也想要喝,但是不能直接把我的喝掉,不然我就沒得喝了,于是乎,你拿出雙魚玉佩(參數param)復制了一杯一模一樣的水?,F在,我們都有了一杯水。然后,你一不小心,摔了一跤,把那杯水倒在地上了( test1中param = 1;),你的水沒了,但是對我沒有什么影響。所以,結果:i=0

2.1例二(參數為引用數據類型:String)

  public static void main(String[] args) {
        String s="s1";
        //傳一個引用類型(引用數據類型:String)
        test2(s);
        System.out.println("s="+s);
        //結果:s=s1
    }
    /**
     * 函數二
     * @param param
     */
    public static void test2(String param) {
        //  吃的開心,去唱歌
        param = "s2";
    }

??例二中,param存儲的是拷貝傳入變量的地址。打個比方,我(s)在沙縣國際大飯店定了個包間“芙蓉廳”,服務員給了我一張房卡(s="s1";),同時我邀請你(test2函數)也來,找服務員給了你一張“芙蓉廳”的房卡(param="s1"),吃了一半,你吃飽了,想去唱歌,你把“芙蓉廳”的房卡(param="s1")扔了,換了“真難聽”ktv包間的房卡(param = "s2";)。此時,我手里的仍然是“芙蓉廳”的房卡(param="s1"),你的換的是自己手里的卡,并沒有把“芙蓉廳”拆了,重新裝修成“真難聽”ktv包間。所以,結果:s=s1

2.1例三(參數為引用數據類型:數組)

  public static void main(String[] args) {
        int[] arr=new int[1];
        arr[0]=1;
        //傳一個引用類型(引用數據類型:數組)
        test3(arr);
        System.out.println("arr[0]="+arr[0]);
        //結果:arr[0]=99
    }
    /**
     * 函數三
     * @param arrParam 復制房卡arr
     */
    public static void test3(int[] arrParam) {
        //喝多了,砸場子
        arrParam[0] = 99;
    }

??例三中,param存儲的是拷貝傳入變量的地址。打個比方,我在沙縣國際大飯店定了個包間“芙蓉廳”,服務員給了我一張房卡(arr),我點了一桌子菜(arr[0]=1;),同時我邀請你(test3函數)也來,找服務員也給了你一張“芙蓉廳”的房卡(arrParam=arr,復制arr的地址),吃了一半,你喝多了,發(fā)酒瘋,把桌子砸了(arrParam[0] = 99;)。我從去了趟廁所,回來一看,一片狼藉,還以為走錯了,拿出卡一看,還是arr呀,沒錯呀,但是一桌子菜砸成渣了(arr[0] = 99;)。所以,結果:arr[0] = 99;

3、總結

??首先,在Java中是值傳遞。值傳遞、引用傳遞中的“值”、“引用”和Java中的數據類型(基本數據類型、引用數據類型)沒有關系,不用把這一點搞混淆。
??其次,在Java中,變量傳給某個函數后,變量本身的值、地址沒有影響。例三中,雖然arr[0] = 99;但是arr數組本身指向的地址卻沒有改變,改變的是數組元素中的地址。
??最后,以上是個人對Java值傳遞的理解,歡迎和大家一起溝通交流。
??著作權歸作者所有。商業(yè)轉載請聯系作者獲得授權,非商業(yè)轉載請注明出處。

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

相關閱讀更多精彩內容

  • JAVA 的值傳遞 預備知識 對象變量與對象在 Java 中,任何對象變量的值都是對存儲在另外一個地方(堆)的一個...
    又是很難取名字的付小白閱讀 407評論 0 0
  • 大家好我是白澤。 這篇打算講講java開發(fā)中新人要知道的一些事情吧 對象引用和值引用,這個是在基礎不過的知識了,但...
    白澤1935閱讀 413評論 0 0
  • 看過一些Java教材的話,對這句話應該不陌生: “在Java里面參數傳遞都是按值傳遞”這句話的意思是:按值傳遞是傳...
    jacky123閱讀 594評論 0 1
  • Java的值傳遞和引用傳遞問題 String的對象是不可修改的,如果真正要達到改變字符串的效果,我們需要使用Str...
    gadfly_only閱讀 616評論 0 50
  • 失控關于作者:凱文·凱利,當今世界最受關注的未來學家,也被人們親切的稱為“KK”。美國著名雜志《連線》第一任主編,...
    珠峰頂看星象閱讀 203評論 0 1

友情鏈接更多精彩內容