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

深入探究Java編程是值傳遞還是引用傳遞

 更新時(shí)間:2022年04月28日 10:07:42   作者:orangemilk_  
大家好,本篇文章主要講的是Java編程是值傳遞還是引用傳遞的探究,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下

文章目的:驗(yàn)證Java語言到底是值傳遞還是引用傳遞以及Java參數(shù)傳遞的實(shí)現(xiàn)原理.

問題引入:

先閱讀代碼段:

public static void main(String[] args){
    Person p=new Person("張三");
    f(p);
    System.out.println("實(shí)參:"+p);
}
public static void f(Person p){
    p.name="李四";
    System.out.println("形參:"+p);
}

運(yùn)行結(jié)果:

形參:Person{name=“李四”}

實(shí)參:Person{name=“李四”}

我們將一個(gè)對象變量傳遞到方法中,然后在方法內(nèi)修改對象的屬性,打印實(shí)參和形參,從表面上看,實(shí)參形參的值都被修改了.難道Java也支持引用傳遞嗎?

答案是:Java語言只支持值傳遞,不支持引用傳遞.

在驗(yàn)證Java參數(shù)傳遞方式之前,我們先要明白函數(shù)值傳遞和引用傳遞的區(qū)別.

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

可以看出值傳遞和引用傳遞的區(qū)別在于對形參的修改會(huì)不會(huì)影響到實(shí)參

1.基本數(shù)據(jù)類型的參數(shù)傳遞

我們將一個(gè)基本數(shù)據(jù)類型傳遞到方法中,然后在方法中修改形參的值,發(fā)現(xiàn)形參的修改并沒有影響到實(shí)參.

public static void main(String[] args){
    int a=1;
    f(p);
    System.out.println("實(shí)參:"+a);
}
public static void f(int a){
    a=2;
    System.out.println("形參:"+a);
}

2.引用數(shù)據(jù)類型的參數(shù)傳遞

在問題引入的例子中,看似形參的修改影響到了實(shí)參,但是只要我們創(chuàng)建一個(gè)新對象,并賦值給形參,此時(shí)再打印實(shí)參和形參,兩者互不影響.說明Java并不符合引用傳遞.

public static void main(String[] args){
    Person p=new Person("張三");
    f(p);
    System.out.println("實(shí)參:"+p);
}
public static void f(Person p){
    p=new Person("李四");
    System.out.println("形參:"+p);
}

3.原理

我們要明白為什么會(huì)發(fā)生這些現(xiàn)象,就要理解Java背后的基本原理:

JVM劃分了很多塊區(qū)域,我們創(chuàng)建的對象就放在堆中,而基本數(shù)據(jù)類型和局部變量都放在棧中.當(dāng)傳遞基本數(shù)據(jù)類型時(shí),是將數(shù)據(jù)創(chuàng)建了一個(gè)副本傳遞到方法中,所以實(shí)參不會(huì)受到形參修改的影響,如圖:

由于對象是放在堆區(qū)的,所以我們只能使用對象的引用來操作這個(gè)對象.

當(dāng)對象引用傳遞給方法時(shí),其實(shí)是創(chuàng)建了一個(gè)引用副本,同時(shí)指向同一個(gè)對象,通過形參引用操作對象時(shí),就好像實(shí)參發(fā)生了變化,其實(shí)對象內(nèi)容改變了,但是對象變量沒有改變,實(shí)參本身是沒有改變的.因此引入問題中的例子就不難理解了.

當(dāng)我們將形參重新賦值的時(shí)候,實(shí)參不會(huì)受到任何影響,此時(shí),實(shí)參和形參已經(jīng)指向了兩個(gè)不同的對象.

所以說,Java只支持值傳遞.

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

相關(guān)文章

  • Java 數(shù)據(jù)結(jié)構(gòu)鏈表操作實(shí)現(xiàn)代碼

    Java 數(shù)據(jù)結(jié)構(gòu)鏈表操作實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java 數(shù)據(jù)結(jié)構(gòu)鏈表操作的相關(guān)資料,并附實(shí)例代碼,需要的朋友可以參考下
    2016-10-10
  • 徹底了解java中ReentrantLock和AQS的源碼

    徹底了解java中ReentrantLock和AQS的源碼

    這篇文章主要介紹了徹底了解java中ReentrantLock和AQS的源碼,想了解鎖機(jī)制的同學(xué),一定要參考下
    2021-04-04
  • SpringBoot部署在Weblogic的操作步驟

    SpringBoot部署在Weblogic的操作步驟

    這篇文章主要介紹了SpringBoot部署在Weblogic的操作步驟,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java中StringRedisTemplate和RedisTemplate的區(qū)別及使用方法

    Java中StringRedisTemplate和RedisTemplate的區(qū)別及使用方法

    本文主要介紹了Java中StringRedisTemplate和RedisTemplate的區(qū)別及使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 微信小程序+后端(java)實(shí)現(xiàn)開發(fā)

    微信小程序+后端(java)實(shí)現(xiàn)開發(fā)

    這篇文章主要介紹了微信小程序+后端(java)實(shí)現(xiàn)開發(fā),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Java面試題之基本語法(圖解)

    Java面試題之基本語法(圖解)

    這篇文章主要介紹了關(guān)于Java面試題之基本語法的相關(guān)資料,文中通過圖片說明介紹的很詳細(xì),相信對大家具有一定的參考價(jià)值,有需要的朋友們下面來一起看看吧。
    2017-02-02
  • Java包裝類的概述與應(yīng)用

    Java包裝類的概述與應(yīng)用

    包裝類使用起來非常方便,但是沒有對應(yīng)的方法來操作這些基本數(shù)據(jù)類型,可以使用一個(gè)類,把基本類型的數(shù)據(jù)裝起來,在類中定義一些方法,我們可以使用類中的方法來操作這些基本類型的數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于Java包裝類的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Maven?項(xiàng)目用Assembly打包可執(zhí)行jar包的方法

    Maven?項(xiàng)目用Assembly打包可執(zhí)行jar包的方法

    這篇文章主要介紹了Maven?項(xiàng)目用Assembly打包可執(zhí)行jar包的方法,該方法只可打包非spring項(xiàng)目的可執(zhí)行jar包,需要的朋友可以參考下
    2023-03-03
  • SpringBoot整合Kafka工具類的詳細(xì)代碼

    SpringBoot整合Kafka工具類的詳細(xì)代碼

    Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),它可以處理消費(fèi)者在網(wǎng)站中的所有動(dòng)作流數(shù)據(jù),這篇文章主要介紹了SpringBoot整合Kafka工具類的代碼詳解,需要的朋友可以參考下
    2022-09-09
  • 一篇文章帶你了解jdk1.8新特性--為什么使用lambda表達(dá)式

    一篇文章帶你了解jdk1.8新特性--為什么使用lambda表達(dá)式

    Lambda是一個(gè)匿名函數(shù),我們可以把Lambda表達(dá)式理解為是一段可以傳遞的代碼,本篇文章就帶你了解,希望能給你帶來幫助
    2021-08-08

最新評論

斗六市| 南汇区| 东丰县| 苍南县| 黎平县| 裕民县| 涪陵区| 张家港市| 祁阳县| 渭南市| 平顶山市| 大荔县| 商都县| 壤塘县| 邯郸市| 金溪县| 富蕴县| 宝应县| 蒲江县| 镇康县| 介休市| 许昌市| 白河县| 三都| 灯塔市| 泗阳县| 灌云县| 太仓市| 永吉县| 孟村| 吉木乃县| 彰化市| 板桥市| 天柱县| 嘉兴市| 临沧市| 鞍山市| 宾阳县| 达尔| 广宁县| 霸州市|