首頁 > Java > java教程 > 一起來分析java是值傳遞還是引用傳遞

一起來分析java是值傳遞還是引用傳遞

WBOY
發布: 2022-05-12 18:40:22
轉載
1927 人瀏覽過

本篇文章為大家帶來了關於java的相關知識,其中主要介紹了關於java到底是值傳遞該是引用傳遞的相關問題,下面一起來看一下,希望對大家有幫助。

一起來分析java是值傳遞還是引用傳遞

推薦學習:《java影片教學

文章目的:驗證Java語言到底是值傳遞還是引用傳遞以及Java參數傳遞的實作原理.


問題引入:
先閱讀程式碼片段:

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);}
登入後複製

運行結果:
形參:Person{name=“李四”}
實參:Person{name=“李四”}

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


答案是:Java語言只支援值傳遞,不支援參考傳遞.

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

  • 值傳遞(pass by value)是指在調用函數時將實際參數複製一份傳遞到函數中,這樣在函數中如果對參數進行修改,將不會影響實際參數。
  • 引用傳遞(pass by reference)是指在呼叫函數時將實際參數的位址直接傳遞到函數中,那麼在函數中對參數所進行的修改,將會影響到實際參數。

可以看出值傳遞和引用傳遞的差異在於對形參的修改會不會影響到實參


1.基本資料型別的參數傳遞

我們將一個基本資料型別傳遞到方法中,然後在方法中修改形參的值,發現形參的修改並沒有影響實參.

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.引用資料型別的參數傳遞

在問題引入的例子中,看似形參的修改影響到了實參,但是只要我們創建一個新對象,並賦值給形參,此時再印出實參與形參,兩者互不影響.說明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.原理

我們要明白為什麼會發生這些現象,就要理解Java背後的基本原理:

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

一起來分析java是值傳遞還是引用傳遞
由於物件是放在堆區的,所以我們只能使用物件的參考來操作這個物件.
當物件參考傳遞給方法時,其實是創建了一個引用副本,同時指向同一個物件,透過形參引用操作物件時,就好像實參發生了變化,其實對象內容改變了,但是對象變量沒有改變,實參本身是沒有改變的.因此引入問題中的例子就不難理解了.

一起來分析java是值傳遞還是引用傳遞
當我們將形參重新賦值的時候,實參不會受到任何影響,此時,實參和形參已經指向了兩個不同的對象.


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

推薦學習:《java影片教學

以上是一起來分析java是值傳遞還是引用傳遞的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板