欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

問題引入:

先閱讀代碼段:

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

運行結(jié)果:

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

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

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

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

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

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

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

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

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

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

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

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

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

3.原理

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

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

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

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

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

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

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

相關(guān)文章

  • java反射獲取和調(diào)用方法

    java反射獲取和調(diào)用方法

    本篇內(nèi)容主要給大家詳細講解了java反射獲取方法以及調(diào)用方法,需要的朋友參考學習一下吧。
    2017-12-12
  • spring整合redisson開啟緩存方式

    spring整合redisson開啟緩存方式

    這篇文章主要介紹了spring整合redisson開啟緩存方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 解決異常:Invalid?keystore?format,springboot配置ssl證書格式不合法問題

    解決異常:Invalid?keystore?format,springboot配置ssl證書格式不合法問題

    這篇文章主要介紹了解決異常:Invalid?keystore?format,springboot配置ssl證書格式不合法問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 有關(guān)ServletConfig與ServletContext的訪問

    有關(guān)ServletConfig與ServletContext的訪問

    下面小編就為大家?guī)硪黄嘘P(guān)ServletConfig與ServletContext的訪問。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java中BigInteger與BigDecimal類用法總結(jié)

    Java中BigInteger與BigDecimal類用法總結(jié)

    在Java中有兩個用于大數(shù)字運算的類,分別是java.math.BigInteger類 和 java.math.BigDecimal類,這兩個類都可以用于高精度計算,BigInteger類是針對整型大數(shù)字的處理類,而BigDecimal類是針對大小數(shù)的處理類,接下來帶大家來學習一下,在Java中如何處理大數(shù)字
    2023-05-05
  • 半小時實現(xiàn)Java手擼網(wǎng)絡(luò)爬蟲框架(附完整源碼)

    半小時實現(xiàn)Java手擼網(wǎng)絡(luò)爬蟲框架(附完整源碼)

    最近在做一個搜索相關(guān)的項目,需要爬取網(wǎng)絡(luò)上的一些鏈接存儲到索引庫中,自己寫了一個簡單的網(wǎng)絡(luò)爬蟲,感興趣的可以了解一下
    2021-06-06
  • 快速掌握Java8中的Optional

    快速掌握Java8中的Optional

    Optional 是一個容器類,代表一個值存在或不存在,Optional并不是用來替換所有的null,而是為了在設(shè)計良好的API中更明確地表達可能缺失的值,這篇文章主要介紹了Java8的Optional及使用,需要的朋友可以參考下
    2023-07-07
  • Java判斷對象是否為空(包括null ,

    Java判斷對象是否為空(包括null ,"")的方法

    這篇文章主要介紹了Java判斷對象是否為空(包括null ,"")的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • Java實現(xiàn)HttpGet請求傳body參數(shù)

    Java實現(xiàn)HttpGet請求傳body參數(shù)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)HttpGet請求傳body參數(shù)的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-02-02
  • Javaweb 鼠標移入移出表格顏色變化的實現(xiàn)

    Javaweb 鼠標移入移出表格顏色變化的實現(xiàn)

    這篇文章主要介紹了Javaweb 鼠標移入移出表格顏色變化的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09

最新評論