本篇文章為大家帶來了關於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參數傳遞方式之前,我們先要明白函數值傳遞和引用傳遞的區別.
可以看出值傳遞和引用傳遞的差異在於對形參的修改會不會影響到實參
我們將一個基本資料型別傳遞到方法中,然後在方法中修改形參的值,發現形參的修改並沒有影響實參.
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影片教學》
以上是一起來分析java是值傳遞還是引用傳遞的詳細內容。更多資訊請關注PHP中文網其他相關文章!