中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中值傳遞和引用傳遞的示例分析

發布時間:2021-06-09 09:52:27 來源:億速云 閱讀:149 作者:小新 欄目:開發技術

小編給大家分享一下Java中值傳遞和引用傳遞的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一、前言

最近在看Java核心卷一,也就是這本書:

Java中值傳遞和引用傳遞的示例分析

在這本書里面也看到了這個問題,Java是值傳遞還是引用傳遞,這個問題其實也是很有意思的,之前也看到過這個問題,但是只是依稀記得是值傳遞,而且網上也有在討論這個問題的。所以就先說結論吧:是值傳遞。

二、值傳遞與引用傳遞

既然討論是值傳遞還是引用傳遞,那肯定是要知道啥是值傳遞、引用傳遞的。

值傳遞:是指在調用函數時將實際參數復制一份傳遞到函數中,這樣在函數中如果對參數進行修改,將不會影響到實際參數。
引用傳遞:是指在調用函數時將實際參數的地址直接傳遞到函數中,那么在函數中對參數所進行的修改,將影響到實際參數。

所以我們就可以做個簡單的比較:

值傳遞引用傳遞 
將參數復制一份傳遞過去將參數的實際地址傳遞過去
不會影響到實際參數會影響到實際參數

我們在方法中,傳遞參數類型有兩種:基本數據類型(數字、布爾)以及對象引用這兩種,所以我們就從這兩種類型進行分析。

三、基本數據類型

以數字int為例:

public class Test {
    public static void main(String[] args) {
        Test test=new Test();
        int i=1;
        test.incr(i);
        System.out.println("main中i的值大小為"+i);
    }
    public void incr(int i){
        i=i+1;
        System.out.println("incr中i為"+i);
    }
}

main方法中的結果要么為1,要么為2,如果還是1的話,那么很大可能就是值傳遞,我們看下輸出結果:

incr中i為2
main中i的值大小為1

可以看到,main方法中的值仍為1,我們來看下這個的過程是怎么樣的:

Java中值傳遞和引用傳遞的示例分析

incr方法中雖然對i的值進行了加一操作,但是他只是將值復制了一份,incr方法執行完畢之后,就會被處理掉,并沒有改掉原先的值,所以才會在main方法中打印出i還是原先的值。

四、對象引用

基本數據類型其實比較好解釋,對象引用其實還是有那么一點迷惑性的,因為有的人可以認為對象引用是引用傳遞,他可以向方法中傳遞一個對象,然后在子方法中修改對象的值,就比如下面的這個例子:
例子一:

public class Test {
    public static void main(String[] args) {
        Test test=new Test();
        Student s1=new Student();
        s1.setId(1);
        test.changeId(s1);
        System.out.println("main中的s1id是"+s1.getId());
    }

    public void changeId(Student student){
        student.setId(2);
        System.out.println("changeId中的id為"+student.getId());
    }
   
}
class Student{
    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

一個很簡單的例子,創建個student對象,只有id這一個字段,將student對象傳遞到子方法中,執行結果會是什么呢?

changeId中的id為2
main中的s1id是2

可以看到阿,main方法與changeId方法中,他們最后的id都是2,所以有的人就會認為,修改了對象中的值,所以是值傳遞。

其實我們看上面值傳遞與引用傳遞的概念,引用傳遞是傳遞的地址,那么我們就假設對象引用是引用傳遞方式,那么我傳遞進去兩個對象,交換他們的位置是可以改變他們的指向的,接下來我們就來看一下會不會改變:
例子二:

package com.dong.No2;

public class Test {
    public static void main(String[] args) {
        Test test=new Test();
        Student s1=new Student();
        Student s2=new Student();
        s1.setId(1);
        s2.setId(2);
        test.changeId2(s1,s2);
        System.out.println("main中的s1id是"+s1.getId()+","+"s2id是"+s2.getId());
    }

    public void changeId2(Student s1,Student s2){
        Student s3=s1;
        s1=s2;
        s2=s3;
        System.out.println("changeId2中的s1id是"+s1.getId()+",s2id是"+s2.getId());
    }
}
class Student{
    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

他的執行結果:

changeId2中的s1id是2,s2id是1
main中的s1id是1,s2id是2

我們發現,這個在子方法中,對象的值是改變了,但是main方法中的值還是原先的樣子,那這樣就不符合引用傳遞了,因為他其實并沒有改變原先的對象。

如果我們以值傳遞的觀點來解釋,那么就可以說的通了,我們傳入的兩個參數s1、s2在傳遞過去后,會復制一份為s1復制、s2復制,然后在子方法中,是對這兩個復制過后的對象進行的操作,執行完之后,這些復制的對象就會被回收,所以就出現了我們在主方法中,看到這兩個對象的值是沒有改變的。

事實上也是如此,我們可以同樣來解釋例子一種,為啥傳入了對象,但是主方法中的值卻改變了。

我們知道對象這些都是在堆中存儲的,我們在向方法中傳遞的,實際上是這個對象在堆中的地址,我們傳遞的對象,實際上就是傳遞的對象的地址:

Java中值傳遞和引用傳遞的示例分析

因為s1與s1復制都是指向的ox123456,s1復制改變了值,那么s1看到的值也就發生了改變,即使是s1復制最后被回收,ox123456的改變不會恢復。

以上是“Java中值傳遞和引用傳遞的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

台东市| 白玉县| 洪江市| 古浪县| 榆林市| 宁强县| 凤山市| 克什克腾旗| 大城县| 宜都市| 岗巴县| 黔东| 山阴县| 柳州市| 安康市| 承德县| 安庆市| 贵溪市| 浦东新区| 竹山县| 辉县市| 福安市| 闸北区| 静海县| 台中县| 衡东县| 牙克石市| 绥阳县| 凌源市| 巩留县| 广水市| 怀安县| 荆州市| 阜康市| 五常市| 苍梧县| 岳普湖县| 灵石县| 日照市| 永仁县| 西贡区|