一起來分析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是值傳遞還是引用傳遞的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。
