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

Java方法參數(shù)是引用調用還是值調用?

 更新時間:2020年04月20日 11:31:32   投稿:lijiao  
Java方法參數(shù)是引用調用還是值調用?這是一個值得思考的問題。閱讀本文,找出答案

方法調用(call by) 是一個標準的計算機科學術語。方法調用根據(jù)參數(shù)傳遞的情況又分為值調用( call by reference ) 和引用調用( call by value ) 。江湖上有很多關于這兩種調用的定義 ,最通常的說法是傳遞值的是值調用,傳遞地址的是引用調用。這其實很不恰當,這種 這些說法很容易讓我們聯(lián)想到Java的對象參數(shù)傳遞是引用調用,實際上,Java的對象參數(shù)傳遞仍然是值調用 。

我們首先用一段代碼來證實一下為什么Java的對象參數(shù)傳遞是值調用。

public class Employee { 

 public String name=null; 

 public Employee(String n){ 
  this.name=n; 
 } 
 //將兩個Employee對象交換 
 public static void swap(Employee e1,Employee e2){ 
  Employee temp=e1; 
  e1=e2; 
  e2=temp; 
    System.out.println(e1.name+" "+e2.name); //打印結果:李四 張三 
 } 
 //主函數(shù) 
 public static void main(String[] args) { 
  Employee worker=new Employee("張三"); 
  Employee manager=new Employee("李四"); 
  swap(worker,manager); 
  System.out.println(worker.name+" "+manager.name); //打印結果仍然是: 張三 李四 
 } 
} 

上面的結果讓人很失望,雖然形參對象e1,e2的內(nèi)容交換了,但實參對象worker,manager并沒有互換內(nèi)容。這里面最重要的原因就在于形參e1,e2是實參worker,manager的地址拷貝。

大家都知道,在Java中對象變量名實際上代表的是對象在堆中的地址(專業(yè)術語叫做對象引用 )。在Java方法調用的時候,參數(shù)傳遞的是對象的引用。重要的是,形參和實參所占的內(nèi)存地址并不一樣,形參中的內(nèi)容只是實參中存儲的對象引用的一份拷貝。

如果大家對JVM內(nèi)存管理中Java棧 的局部變量區(qū) 有所了解的話(可以參見《 Java 虛擬機體系結構 》),就很好理解上面這句話。在JVM運行上面的程序時,運行main方法和swap方法,會在Java棧中先后push兩個叫做棧幀 的內(nèi)存空間。main棧幀中有一塊叫局部變量區(qū)的內(nèi)存用來存儲實參對象worker和manager的引用。而swap棧幀中的局部變量區(qū)則存儲了形參對象e1和e2的引用。雖然e1和e2的引用值分別與worker和manager相同,但是它們占用了不同的內(nèi)存空間。當e1和e2的引用發(fā)生交換時,下面的圖很清晰的看出完全不會影響worker和manager的引用值。

Java對象參數(shù)傳遞雖然傳遞的是地址(引用),但仍然是值調用。是時候需要給引用調用和值調用一個準確的定義了。

值調用(call by value): 在參數(shù)傳遞過程中,形參和實參占用了兩個完全不同的內(nèi)存空間。形參所存儲的內(nèi)容是實參存儲內(nèi)容的一份拷貝。實際上,Java對象的傳遞就符合這個定義,只不過形參和實參所儲存的內(nèi)容并不是常規(guī)意義上的變量值,而是變量的地址???,回過頭想想:變量的地址不也是一種值嗎!

引用調用(call by reference) : 在參數(shù)傳遞的過程中,形參和實參完全是同一塊內(nèi)存空間,兩者不分彼此。 實際上,形參名和實參名只是編程中的不同符號,在程序運行過程中,內(nèi)存中存儲的空間才是最重要的。不同的變量名并不能說明占用的內(nèi)存存儲空間不同。

大體上說,兩種調用的根本并不在于傳遞的是值還是地址(畢竟地址也是一個值),而是在于形參和實參是否占用同一塊內(nèi)存空間。事實上,C/C++的指針參數(shù)傳遞也是值調用,不信試試下面的C代碼吧!

#include<stdio.h> 
void swap(int *a1,int *b1){ 
 int *t=a1; 
 a1=b1; 
 b1=t; 
} 
int main(){ 
 int x1=100; 
 int x2=200; 
  int *a=&x1; 
 int *b=&x2; 
 printf("%d %d\n",*a,*b); 
 swap(a,b); 
 printf("%d %d\n",*a,*b); 
 return 0; 
} 

但C/C++是有引用調用的,這就是C/C++一種叫做引用的變量聲明方法: int a; int &ra=a; 其中ra是a的別名,兩者在內(nèi)存中沒有區(qū)別,占用了同一個內(nèi)存空間。而通過引用(別名)的參數(shù)傳遞就符合引用調用的特點了。大家可以去試試void swap(int &a1,int &b1);的運行結果。

通過本文大家應該知道Java方法參數(shù)是引用調用還是值調用了吧。

相關文章

  • Java?spring?boot發(fā)送郵箱實現(xiàn)過程記錄

    Java?spring?boot發(fā)送郵箱實現(xiàn)過程記錄

    我們在?站上注冊賬號的時候?般需要獲取驗證碼,?這個驗證碼?般發(fā)送在你的?機號上還有的是發(fā)送在你的郵箱中,這篇文章主要給大家介紹了關于Java?spring?boot發(fā)送郵箱實現(xiàn)的相關資料,需要的朋友可以參考下
    2024-01-01
  • Java中Lambda表達式并行與組合行為

    Java中Lambda表達式并行與組合行為

    這篇文章主要介紹了Java中Lambda表達式并行與組合行為,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • 詳解前后端分離之Java后端

    詳解前后端分離之Java后端

    這篇文章主要介紹了詳解前后端分離之Java后端,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Intelli IDEA安裝Scala插件并安裝Scala軟件和配置環(huán)境變量的詳細教程

    Intelli IDEA安裝Scala插件并安裝Scala軟件和配置環(huán)境變量的詳細教程

    這篇文章主要介紹了Intelli IDEA安裝Scala插件并安裝Scala軟件和配置環(huán)境變量的詳細教程,需要的朋友可以參考下
    2020-10-10
  • Java 替換字符串右側出現(xiàn)的第一個子串方式

    Java 替換字符串右側出現(xiàn)的第一個子串方式

    這篇文章主要介紹了Java 替換字符串右側出現(xiàn)的第一個子串方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java啟動參數(shù)之謎的排查過程

    java啟動參數(shù)之謎的排查過程

    在日常操作中,相信很多人對Java啟動參數(shù)存在疑惑,下面這篇文章主要給大家介紹了關于java啟動參數(shù)之謎的排查過程,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • 詳解Spring如何避免被JVM 垃圾回收

    詳解Spring如何避免被JVM 垃圾回收

    如果Spring 被回收掉,Spring管理的bean全部會被回收,那我們的Java應用不就被一鍋端了嗎?所以本文小編將和大家一起聊聊Spring如何避免被JVM垃圾回收,需要的朋友可以參考下
    2023-11-11
  • java實現(xiàn)多線程交替打印兩個數(shù)

    java實現(xiàn)多線程交替打印兩個數(shù)

    這篇文章主要為大家詳細介紹了java實現(xiàn)多線程交替打印兩個數(shù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 在java List中進行模糊查詢的實現(xiàn)方法

    在java List中進行模糊查詢的實現(xiàn)方法

    下面小編就為大家?guī)硪黄趈ava List中進行模糊查詢的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • SpringBoot詳細介紹SPI機制示例

    SpringBoot詳細介紹SPI機制示例

    這篇文章主要介紹了深入解析Spring Boot的SPI機制詳情,SPI是JDK內(nèi)置的一種服務提供發(fā)現(xiàn)機制,可以用來啟用框架擴展和替換組件,主要用于框架中開發(fā),更多相關介紹,感興趣的小伙伴可以參考一下下面文章內(nèi)容
    2022-08-08

最新評論