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

全面理解Java中的引用傳遞和值傳遞

 更新時(shí)間:2021年10月27日 09:47:29   作者:邴越  
這篇文章主要介紹了全面理解Java中的引用傳遞和值傳遞,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

關(guān)于Java傳參時(shí)是引用傳遞還是值傳遞,是一個(gè)討論比較多的話(huà)題,

有說(shuō)Java中只有值傳遞,也有些地方說(shuō)引用傳遞和值傳遞都存在,本篇記錄思考過(guò)程,不保證正確性,

感興趣的同學(xué)一起討論。

1.基本類(lèi)型和引用類(lèi)型在內(nèi)存中的保存

Java中數(shù)據(jù)類(lèi)型分為兩大類(lèi),基本類(lèi)型和對(duì)象類(lèi)型。相應(yīng)的,變量也有兩種類(lèi)型:基本類(lèi)型和引用類(lèi)型。

基本類(lèi)型的變量保存原始值,即它代表的值就是數(shù)值本身;

而引用類(lèi)型的變量保存引用值,"引用值"指向內(nèi)存空間的地址,代表了某個(gè)對(duì)象的引用,而不是對(duì)象本身,

對(duì)象本身存放在這個(gè)引用值所表示的地址的位置。

基本類(lèi)型包括:byte,short,int,long,char,float,double,Boolean,returnAddress,

引用類(lèi)型包括:類(lèi)類(lèi)型,接口類(lèi)型和數(shù)組。

相應(yīng)的,變量也有兩種類(lèi)型:基本類(lèi)型和引用類(lèi)型。

2.變量的基本類(lèi)型和引用類(lèi)型的區(qū)別

基本數(shù)據(jù)類(lèi)型在聲明時(shí)系統(tǒng)就給它分配空間:

int a;
a=10;//正確,因?yàn)槁暶鱝時(shí)就分配了空間

引用則不同,它聲明時(shí)只給變量分配了引用空間,而不分配數(shù)據(jù)空間:

Date date;
//執(zhí)行實(shí)例化,開(kāi)辟數(shù)據(jù)空間存放Date對(duì)象,然后把空間的首地址傳給today變量 
//date=new Date();
//如果注釋掉上一步操作
//The local variable date may not have been initialized
//也就是說(shuō)對(duì)象的數(shù)據(jù)空間沒(méi)有分配
date.getDate();

看一下下面的初始化過(guò)程,注意"引用"也是占用空間的,一個(gè)空Object對(duì)象的引用大小大概是4byte:

Date a,b; //在內(nèi)存開(kāi)辟兩個(gè)引用空間
a = new Date();//開(kāi)辟存儲(chǔ)Date對(duì)象的數(shù)據(jù)空間,并把該空間的首地址賦給a
b = a; //將a存儲(chǔ)空間中的地址寫(xiě)到b的存儲(chǔ)空間中

3.引用傳遞和值傳遞

這里要用實(shí)際參數(shù)和形式參數(shù)的概念來(lái)幫助理解,

值傳遞:

方法調(diào)用時(shí),實(shí)際參數(shù)把它的值傳遞給對(duì)應(yīng)的形式參數(shù),函數(shù)接收的是原始值的一個(gè)copy,此時(shí)內(nèi)存中存在兩個(gè)相等的基本類(lèi)型,即實(shí)際參數(shù)和形式參數(shù),后面方法中的操作都是對(duì)形參這個(gè)值的修改,不影響實(shí)際參數(shù)的值。

引用傳遞:

也稱(chēng)為傳地址。方法調(diào)用時(shí),實(shí)際參數(shù)的引用(地址,而不是參數(shù)的值)被傳遞給方法中相對(duì)應(yīng)的形式參數(shù),函數(shù)接收的是原始值的內(nèi)存地址;

在方法執(zhí)行中,形參和實(shí)參內(nèi)容相同,指向同一塊內(nèi)存地址,方法執(zhí)行中對(duì)引用的操作將會(huì)影響到實(shí)際對(duì)象。

看一個(gè)例子:

class MyObj{
    public int b=99;
}

分別傳參int和對(duì)象類(lèi)型:

public class ReferencePkValue2 {
     
    public static void main(String[] args) { 
        ReferencePkValue2 t = new ReferencePkValue2(); 
        int a=99; 
        t.test1(a);//這里傳遞的參數(shù)a就是按值傳遞 
        System.out.println(a);
         
        MyObj obj=new MyObj(); 
        t.test2(obj);//這里傳遞的參數(shù)obj就是引用傳遞
        System.out.println(obj.b);
    } 
     
    public void test1(int a){ 
        a=a++;
        System.out.println(a);
        } 
     
    public void test2(MyObj obj){ 
        obj.b=100;
        System.out.println(obj.b);
        }
}

輸出是:

99

99

100

100

可以看到,int值沒(méi)有發(fā)生變化,但是在test2方法中對(duì)obj類(lèi)做的修改影響了obj這個(gè)對(duì)象。

這里要特殊考慮String,以及Integer、Double等幾個(gè)基本類(lèi)型包裝類(lèi),它們都是immutable類(lèi)型,

因?yàn)闆](méi)有提供自身修改的函數(shù),每次操作都是新生成一個(gè)對(duì)象,所以要特殊對(duì)待,可以認(rèn)為是和基本數(shù)據(jù)類(lèi)型相似,傳值操作。

看下面的例子:

public class ReferencePkValue1 {
    public static void main(String[] args){
        ReferencePkValue1 pk=new ReferencePkValue1();
        //String類(lèi)似基本類(lèi)型,值傳遞,不會(huì)改變實(shí)際參數(shù)的值
        String test1="Hello";
        pk.change(test1);
        System.out.println(test1);
         
        //StringBuffer和StringBuilder等是引用傳遞
        StringBuffer test2=new StringBuffer("Hello");
        pk.change(test2);         
        System.out.println(test2.toString());
    }
     
    public void change(String str){
        str=str+"world";
    }
     
    public void change(StringBuffer str){
        str.append("world");
    }
}

輸出是:

Hello

Helloworld

對(duì)String和StringBuffer的操作產(chǎn)生了不同的結(jié)果。

4.結(jié)論

結(jié)合上面的分析,關(guān)于值傳遞和引用傳遞可以得出這樣的結(jié)論:

(1)基本數(shù)據(jù)類(lèi)型傳值,對(duì)形參的修改不會(huì)影響實(shí)參;

(2)引用類(lèi)型傳引用,形參和實(shí)參指向同一個(gè)內(nèi)存地址(同一個(gè)對(duì)象),所以對(duì)參數(shù)的修改會(huì)影響到實(shí)際的對(duì)象;

(3)String, Integer, Double等immutable的類(lèi)型特殊處理,可以理解為傳值,最后的操作不會(huì)修改實(shí)參對(duì)象。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Boot 啟動(dòng)端口如何啟動(dòng)

    Spring Boot 啟動(dòng)端口如何啟動(dòng)

    這篇文章主要介紹了Spring Boot 啟動(dòng)端口如何啟動(dòng)的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Dubbo實(shí)現(xiàn)分布式日志鏈路追蹤

    Dubbo實(shí)現(xiàn)分布式日志鏈路追蹤

    這篇文章主要介紹了Dubbo實(shí)現(xiàn)分布式日志鏈路追蹤方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring Boot攔截器Interceptor與過(guò)濾器Filter詳細(xì)教程(示例詳解)

    Spring Boot攔截器Interceptor與過(guò)濾器Filter詳細(xì)教程(示例詳解)

    本文詳細(xì)介紹了SpringBoot中的攔截器(Interceptor)和過(guò)濾器(Filter),包括它們的定義、作用范圍、使用場(chǎng)景、實(shí)現(xiàn)步驟、執(zhí)行順序、常見(jiàn)問(wèn)題及解決方案,感興趣的朋友跟隨小編一起看看吧
    2025-03-03
  • mybatis實(shí)現(xiàn)特殊字段加密方式

    mybatis實(shí)現(xiàn)特殊字段加密方式

    這篇文章主要介紹了mybatis實(shí)現(xiàn)特殊字段加密,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Spring?Framework六種常見(jiàn)設(shè)計(jì)模式

    Spring?Framework六種常見(jiàn)設(shè)計(jì)模式

    設(shè)計(jì)模式是軟件開(kāi)發(fā)的重要組成部分,本文借助spring來(lái)講解這個(gè)框架的設(shè)計(jì)模式,通過(guò)本文我們探討了spring如何利用這些模式來(lái)提供這些豐富的功能,對(duì)本文感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • java題解Leetcode 8字符串轉(zhuǎn)換整數(shù)

    java題解Leetcode 8字符串轉(zhuǎn)換整數(shù)

    這篇文章主要為大家介紹了java題解Leetcode 8字符串轉(zhuǎn)換整數(shù)實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • JAVA各種OOM代碼示例與解決方法

    JAVA各種OOM代碼示例與解決方法

    這篇文章主要給大家介紹了關(guān)于JAVA各種OOM代碼示例與解決方法的相關(guān)資料,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Spring Boot 如何自定義返回錯(cuò)誤碼錯(cuò)誤信息

    Spring Boot 如何自定義返回錯(cuò)誤碼錯(cuò)誤信息

    這篇文章主要介紹了Spring Boot 如何自定義返回錯(cuò)誤碼錯(cuò)誤信息的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • win10下定時(shí)運(yùn)行與開(kāi)機(jī)自啟動(dòng)jar包的方法記錄

    win10下定時(shí)運(yùn)行與開(kāi)機(jī)自啟動(dòng)jar包的方法記錄

    這篇文章主要給大家介紹了關(guān)于win10下定時(shí)運(yùn)行與開(kāi)機(jī)自啟動(dòng)jar包的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java中Stream?Filter多條件篩選過(guò)濾代碼舉例

    Java中Stream?Filter多條件篩選過(guò)濾代碼舉例

    這篇文章主要給大家介紹了關(guān)于Java中Stream?Filter多條件篩選過(guò)濾的相關(guān)資料,Java Stream中的filter方法可以使用多個(gè)條件來(lái)過(guò)濾數(shù)據(jù),文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-12-12

最新評(píng)論

荥阳市| 渭源县| 托克逊县| 南和县| 安达市| 社会| 江陵县| 乌恰县| 金溪县| 同仁县| 神农架林区| 克山县| 新沂市| 绍兴市| 清远市| 锦屏县| 墨江| 平果县| 伊宁市| 金门县| 大宁县| 同心县| 中宁县| 醴陵市| 洪湖市| 巨鹿县| 巴楚县| 东乡县| 霍城县| 神木县| 孝昌县| 渑池县| 房山区| 高雄县| 南陵县| 新沂市| 色达县| 溧阳市| 兴文县| 商南县| 乌拉特前旗|