最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Java到底是值傳遞還是引用傳遞呢

 更新時間:2021年06月08日 14:36:00   作者:XH雪浪風(fēng)塵  
今天帶大家學(xué)習(xí)Java的相關(guān)知識,文章圍繞著Java到底是值傳遞還是引用傳遞展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下

一、前言

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

在這里插入圖片描述

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

二、值傳遞與引用傳遞

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

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

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

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

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

三、基本數(shù)據(jù)類型

以數(shù)字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方法中的結(jié)果要么為1,要么為2,如果還是1的話,那么很大可能就是值傳遞,我們看下輸出結(jié)果:

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

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

在這里插入圖片描述

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

四、對象引用

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

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;
    }
}

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

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

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

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

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;
    }
}

他的執(zhí)行結(jié)果:

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

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

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

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

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

在這里插入圖片描述

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

五、結(jié)論

所以Java中的傳遞只有值傳遞而沒有引用傳遞,只不過傳遞為基本數(shù)據(jù)類型的話,是復(fù)制的數(shù)值,而對象類型的話,則是復(fù)制的對象存放地址。

到此這篇關(guān)于淺談Java到底是值傳遞還是引用傳遞呢的文章就介紹到這了,更多相關(guān)Java值傳遞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java String拼接時的問題匯總

    java String拼接時的問題匯總

    在本篇文章里小編給大家整理的是關(guān)于java String拼接時的問題匯總,有需要的朋友們可以參考下。
    2020-02-02
  • 關(guān)于MyBatis結(jié)果映射的實例總結(jié)

    關(guān)于MyBatis結(jié)果映射的實例總結(jié)

    結(jié)果集映射主要是為了解決屬性名和類型名不一致的問題,下面這篇文章主要給大家介紹了關(guān)于MyBatis結(jié)果映射的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • Java實現(xiàn)導(dǎo)出Word文檔的示例代碼

    Java實現(xiàn)導(dǎo)出Word文檔的示例代碼

    poi-tl是一個基于Apache POI的Word模板引擎,也是一個免費開源的Java類庫,你可以非常方便的加入到你的項目中。本文就利用它實現(xiàn)導(dǎo)出Word文檔功能,需要的可以參考一下
    2023-02-02
  • Java中線程的等待與喚醒_動力節(jié)點Java學(xué)院整理

    Java中線程的等待與喚醒_動力節(jié)點Java學(xué)院整理

    在Object.java中,定義了wait(), notify()和notifyAll()等接口。wait()的作用是讓當(dāng)前線程進(jìn)入等待狀態(tài),同時,wait()也會讓當(dāng)前線程釋放它所持有的鎖。下面通過本文給大家介紹Java中線程的等待與喚醒知識,感興趣的朋友一起看看吧
    2017-05-05
  • request如何獲取完整url(包括域名、端口、參數(shù))

    request如何獲取完整url(包括域名、端口、參數(shù))

    這篇文章主要介紹了request如何獲取完整url(包括域名、端口、參數(shù))問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java通過PowerMockito和Mokito進(jìn)行單元測試的實現(xiàn)

    Java通過PowerMockito和Mokito進(jìn)行單元測試的實現(xiàn)

    PowerMockito和Mockito都是Java語言中的測試框架,用于進(jìn)行單元測試和集成測試,本文就來詳細(xì)的介紹一下通過PowerMockito和Mokito進(jìn)行單元測試,感興趣的可以了解一下
    2023-08-08
  • debug模式遲遲不能啟動問題及解決

    debug模式遲遲不能啟動問題及解決

    在使用Debug模式進(jìn)行代碼測試時,由于設(shè)置了過多的斷點,導(dǎo)致程序加載緩慢甚至無法啟動,解決此問題的方法是取消不必要的斷點,通過IDE的斷點管理功能,檢查并移除問題斷點,從而優(yōu)化調(diào)試效率,分享此經(jīng)驗希望能幫助遇到相同問題的開發(fā)者
    2022-11-11
  • Java實戰(zhàn)之網(wǎng)上書店管理系統(tǒng)的實現(xiàn)

    Java實戰(zhàn)之網(wǎng)上書店管理系統(tǒng)的實現(xiàn)

    本文將利用Java語言實現(xiàn)網(wǎng)上書店管理系統(tǒng)。其功能一般包括:圖書信息管理、用戶信息管理、圖書購買、圖書訂單查看、圖書添加、圖書維護(hù)等等,感興趣的可以了解一下
    2022-06-06
  • 基于SpringBoot實現(xiàn)文件秒傳功能

    基于SpringBoot實現(xiàn)文件秒傳功能

    在開發(fā)Web應(yīng)用時,文件上傳是一個常見需求,然而,當(dāng)用戶需要上傳大文件或相同文件多次時,會造成帶寬浪費和服務(wù)器存儲冗余,此時可以使用文件秒傳技術(shù)通過識別重復(fù)文件,本文就給大家介紹了如何基于SpringBoot實現(xiàn)文件秒傳功能,需要的朋友可以參考下
    2025-04-04
  • java中的Serializable、transient關(guān)鍵字詳解

    java中的Serializable、transient關(guān)鍵字詳解

    這篇文章主要介紹了java中的Serializable、transient關(guān)鍵字詳解,序列化只會保存屬性值,不會保存方法,通過反序列化可以把序列化后的內(nèi)容恢復(fù)成對象,需要的朋友可以參考下
    2023-09-09

最新評論

铁力市| 南通市| 闻喜县| 高淳县| 余干县| 石柱| 丰台区| 玉山县| 钦州市| 攀枝花市| 黄梅县| 连山| 日土县| 石台县| 望奎县| 金沙县| 长治县| 革吉县| 姜堰市| 宁津县| 连江县| 鹤庆县| 宿州市| 蒙山县| 新龙县| 阿尔山市| 永嘉县| 苍南县| 永定县| 铜鼓县| 增城市| 若尔盖县| 盈江县| 茌平县| 永福县| 灵武市| 沙河市| 娱乐| 吐鲁番市| 洛南县| 镇巴县|