這個問題在這里已經有了答案: Java 是“按參考傳遞”還是“按值傳遞”? (91 個回答) 4天前關閉。
我與某人討論過 Java 是否完全按值傳遞。下面的代碼讓我思考了一下:
public static void main(String [] args){
Student studentMain = new Student();
studentMain.setName("Tristan");
changeName(studentMain);
studentMain.getName().equals("Yannick"); //This is true
changeStudent(studentMain);
studentMain.getName().equals("Vic"); //This is false
}
private changeName(Student studentParam1){
studentParam1.setName("Yannick");
}
private changeStudent(Student studentParam2){
studentParam2 = new Student();
studentParam2.setName("Vic");
}
如果 Java 純粹是通過參考傳遞,那么這段代碼將產生兩次“真”,但事實并非如此。所以我得出以下邏輯:
由于 changeName() 確實更改了原始物件 (studentMain),因此它必須指向相同的記憶體。但是由于 changeStudent() 沒有改變 studentMain,這意味著它不會直接指向同一個記憶體。
我認為它是一個鏈條:
記憶體 <- studentMain <- studentParam1
記憶體 <- studentMain <- studentParam2
在 changeName() 中,您更改了 studentParam1 的一個屬性,它將這個槽傳遞給 studentMain,而 studentMain 又將它傳遞給記憶體。您的鏈仍然如下:
記憶體 <- studentMain <- studentParam1
在 changeStudent() 中,您不會更改屬性,而是更改 studentParam2 本身。它現在指向新形成的學生在記憶中的一個新位置。原始參考 (studentMain) 沒有改變,因為它仍然指向原始記憶體。你打破了鏈條并創造了一個新的鏈條。在方法結束時,新形成的參考 (studentParam2) 將丟失到范圍內,并將由垃圾收集器處理。你的鏈條變成:
記憶體 <- 學生主
其他記憶體 <- studentParam2
Pass-by-value 意味著傳遞了一個值的副本。參考傳遞意味著參考被傳遞(這意味著在整個程式中共享一個參考)。然而,我得出結論,它實際上是某種混合形式。你按值傳遞,但值本身是一個參考。因此傳遞了初始參考的副本。
我期待著您對此事的看法。
PS:這個結論是關于物件,而不是原始資料型別。
uj5u.com熱心網友回復:
Java 總是按值傳遞——只是有時參考就是值。
在一個方法中,您有一個帶有提供參考的區域變數,因此更改此參考下物件的屬性將修改原始物件。
另一方面,如果您將重新分配區域變數,那么原始變數將不會改變(仍然包含第一個參考)并且原始物件也不會被修改
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/411928.html
標籤:
下一篇:如何將嵌套物件鍵收集到陣列中?
