一. 介紹 值傳遞:值傳遞(Pass-by-Value)當我們向方法傳遞參數時,實際上是將該參數的值進行拷貝,並將拷貝後的值傳遞給方法內部。在方法內部對參數進行修改不會影響原始變數的值。 引用傳遞:引用傳遞(Pass by reference)是指方法調用時實參(即傳入方法的參數)是一個對象的引用, ...
一. 介紹
值傳遞:值傳遞(Pass-by-Value)當我們向方法傳遞參數時,實際上是將該參數的值進行拷貝,並將拷貝後的值傳遞給方法內部。在方法內部對參數進行修改不會影響原始變數的值。
引用傳遞:引用傳遞(Pass by reference)是指方法調用時實參(即傳入方法的參數)是一個對象的引用,而不是對象本身。當一個對象的引用被傳遞給一個方法時,方法內部對該引用的操作會影響到原始對象。
public static void main(String[] args) { int value = 10; StringBuilder reference = new StringBuilder("Hello"); // 值傳遞 changeValue(value); System.out.println("Value after method call: " + value); // 引用傳遞 changeReference(reference); System.out.println("Reference after method call: " + reference); } public static void changeValue(int number) { number = 20; } public static void changeReference(StringBuilder str) { str.append(" World"); } // 輸出結果: Value after method call: 10 Reference after method call: Hello World
二. 執行過程:
值傳遞:
- 首先,在調用方法時,將實際參數的值複製一份,並將這份副本傳遞給方法進行操作。
- 在方法內部,這個副本的值被賦給一個新的局部變數。
- 在方法執行過程中,對該局部變數的任何改動都不會影響原始的變數,因為它們指向的是不同的記憶體空間。
- 當方法執行完畢後,這個局部變數和方法的棧幀都會被銷毀,而原始的變數的值保持不變。
基本數據類型的傳遞過程中,傳入的值被覆制到方法內部,併在方法內部進行操作,但不會影響原始變數的值。
引用傳遞:
- 創建一個對象並將其引用賦值給一個變數。
- 將這個變數作為參數傳遞給一個方法。
- 在方法內部,參數變數接收到了對原始對象的引用。
- 在方法內部修改參數變數所指向的對象時,原始對象也會受到影響。
- 方法執行完畢後,返回到原始調用處,可以通過原始變數訪問到被修改後的對象。
對象的引用傳遞意味著傳遞的是對象的引用,通過引用可以訪問和修改原始對象的屬性。
三. 擴展
引用類型傳遞:
public class User { private String name; private int age; // 略:構造方法、getter、setter、toString() 等 } public class Main { public static void main(String[] args) { // 創建一個實體對象, 存儲在堆記憶體中。 User user = new User("小明", 18); System.out.println(method(user)); System.out.println(user); } //創建一個method(),將實體參數傳入 public static User method(User user) { user.setName("小美"); user.setAge(20); return user; } } 輸出結果: User{name='小美', age=20} User{name='小美', age=20}
① 在棧中分配記憶體空間,創建一個名為 "user" 的引用變數;
② 在堆中分配記憶體空間,創建一個 User 類的實例對象,並將其地址賦值給 "user" 引用變數。
③ 調用 User 類的構造方法,傳入參數 "小明" 和 18,初始化實例對象的屬性值。
④ method() 方法進棧,並傳遞user變數的引用地址值作為參數。
⑤ 進入方法體中,執行setter 方法,改變user變數中的屬性值,user.setName("小美"); user.setAge(20);並return user; 此時已經改變了引用地址值內的屬性;
⑥ 列印輸出結果。
完