您好,登錄后才能下訂單哦!
java有幾種傳值方式?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
值傳遞:是指在調用函數時將實際參數復制一份傳遞給形參,這樣在函數中對形參的修改將不會影響到實際參數的值。
引用傳遞:是指在調用函數時將實際參數的地址直接傳遞到形參,那么在函數中對參數所進行的修改,將會影響到實際參數的值。
java怎么傳值?
java的傳值方式:值傳遞(所有發生的變化只限制在方法體中,出了方法體,任何的修改操作都不再有效)。
我們可以使用一段程序來驗證Java中只有值傳遞
/** * 驗證java中只有值傳遞 */ class User{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }public class TestValue { public static void change(User user2,int a2){ System.out.println("改變之前:"+user2.getName()+",a2="+a2); user2.setName("李四"); //改變 user2 的 name 值 a2 = 10; //改變 a2 的值 System.out.println("改變之后:"+user2.getName()+",a2="+a2); user2 = new User(); //將 user2 重新指向一個新對象 user2.setName("王五"); System.out.println("重新指向一個新對象后:"+user2.getName()); } public static void main(String[] args){ User user1 = new User(); user1.setName("張三"); //初始化 user1 的 name 為張三 int a1 = 5; //初始化 a1 的值為 5 change(user1,a1); //調用方法驗證傳值方式 System.out.println("調用方法后:"+user1.getName()+",a1="+a1); } }
運行這段程序,輸出結果為:
改變之前:張三,a2=5 改變之后:李四,a2=10 重新指向一個新對象后:王五 調用方法后:李四,a1=5
結果分析
下面我們以上圖為輔助,來分析這段程序,首先我們定義了一個User
類,然后在測試類中實例化了一個User
對象,名為user1
,并且為其賦值name = '張三'。
此時在內存中如圖1
所示,實例化一個對象相當于在堆中開辟了一塊內存,內存地址為017
,此時這個對象的引用為user1
,內存地址為001
,它保存了該對象在內存中的地址,也就是指向了該對象。
接下了,我們調用方法change()
,來嘗試改變user1
的name
值以此驗證java中的傳值方式。
我們將user1
作為實參傳給change()
方法,形參user2
來接受這個實參,在這里就體現出了兩種傳參方式的不同。如果是按值傳遞,那么就像定義的那樣。
如圖2
所示,user2
是user1
的一份副本,也就是說在傳遞參數時,將user1
(本身是一個對象的引用),復制了一份,名為user2
,它同樣也是一個對象的引用,并且user1
和user2
此時指向同一個對象。
而如果是引用傳遞,也如同定義的那樣,如圖5
所示,在傳遞參數時,是直接將user1
傳遞給了形參,只是換了一個名字叫做user2
,但是本質上user1
和user2
其實是同一個。它是一個對象的引用。
接著來分析輸出的結果,不管是按值傳遞還是引用傳遞,第1行輸出的結果一定都是張三
,因為都是指向同一個對象。對于第2行輸出,我們還是無法判斷是哪種方式,因為都是改變同一個對象,值也會改變;關鍵在于第3行輸出和第4行輸出。
此時,我們將user2
重新指向了一個新的對象,并且為這個對象賦值name = '王五'
,如果是引用傳遞的方式,那么user1
同樣也會改變指向,指向新的這個對象,最后一行調用方法之后輸出的結果將會和第3行一樣是王五
,但是事實輸出的是李四
。這表明user1
和user2
其實并不是同一個。
真實的調用過程如 圖2
~圖4
所示,這樣才會使得user2
指向一個新的對象后,user1
指向的對象并沒有改變,還是原來那個對象。
對于基本類型的參數來說,a1
的值最后沒有改變,說明在執行方法時,a2
是a1
的一個副本。
對于引用類型的參數來說,例如User
對象,在調用方法時,實際上是將其引用user1
作為實際參數,那么傳遞給形參的將是該引用的一份副本引用user2
,雖然說這是兩份引用(好比a1
與a2
的關系)。
但是卻指向同一個對象,所有的操作也都是對這同一個對象而言的。
尾聲
通過以上分析我們可以知道。Java中只有值傳遞這一種方式,只不過對于引用類型來說,傳遞的參數是對象的引用罷了。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。