您好,登錄后才能下訂單哦!
本篇內容主要講解“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)是指在調用函數時將實際參數的地址直接傳遞到函數中,那么在函數中對參數所進行的修改,將影響到實際參數。
可以看出值傳遞和引用傳遞的區別在于對形參的修改會不會影響到實參
我們將一個基本數據類型傳遞到方法中,然后在方法中修改形參的值,發現形參的修改并沒有影響到實參.
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);}
在問題引入的例子中,看似形參的修改影響到了實參,但是只要我們創建一個新對象,并賦值給形參,此時再打印實參和形參,兩者互不影響.說明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);}
我們要明白為什么會發生這些現象,就要理解Java背后的基本原理:
JVM劃分了很多塊區域,我們創建的對象就放在堆中,而基本數據類型和局部變量都放在棧中.當傳遞基本數據類型時,是將數據創建了一個副本傳遞到方法中,所以實參不會受到形參修改的影響,如圖:
由于對象是放在堆區的,所以我們只能使用對象的引用來操作這個對象.
當對象引用傳遞給方法時,其實是創建了一個引用副本,同時指向同一個對象,通過形參引用操作對象時,就好像實參發生了變化,其實對象內容改變了,但是對象變量沒有改變,實參本身是沒有改變的.因此引入問題中的例子就不難理解了.
當我們將形參重新賦值的時候,實參不會受到任何影響,此時,實參和形參已經指向了兩個不同的對象.
所以說,Java只支持值傳遞.
到此,相信大家對“java支持值傳遞還是引用傳遞”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。