java中向方法傳遞參數是,是將參數的副本傳遞進去,即方法運行時會被分配一塊內存區域保存一個參數值的copy,修改副本值,對原參數並沒有影響。
要理解形參和實參,並在編碼中避免一些必要的錯誤,需要弄清兩個概念。
1、什么是形參和實參
2、方法調用時參數傳遞的過程
3、值傳遞和引用傳遞
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; public class ArgumentsTest { public static void main(String[] args){ Emp empA = new Emp("ke",22); int num = 22; apply(empA); System.out.println(empA); apply2(num); System.out.println(num); } public static void apply(Emp emp){ emp = new Emp("li",77); } public static void apply2(int num){ num = 33; } @AllArgsConstructor @NoArgsConstructor @Data static class Emp{ private String name; private int age; } }
首先什么是形參什么是實參?
在上述代碼中,apply方法的參數emp,就是形參,形式參數,它代表實際參數來參與方法的邏輯;而實參就是在調用方法時,向方法傳遞的參數值,即main方法中empA。
在方法運行時參數是如何傳遞的呢?
首先,每個變量都會在內存中對應一個內存空間,用來存放參數值。而在方法運行時,虛擬機會在棧中創建內存空間保存一個實參的副本,該內存空間會在方法調用結束時銷毀,該對副本的修改不會影響原參數的值。
值傳遞和引用傳遞?
在java中有兩種數據類型,基本類型和引用類型。當變量是基本類型是,變量對應的內存空間保存的變量值,如上述代碼中num保存22;當變量是引用類型時,內存中保存的是實際對象在堆中的地址。
而在方法調用時,傳遞的都是變量對應內存中的值,不同的是基本類型參數傳遞值給方法,引用類型參數傳遞對象內存地址給方法。
引用類型包括:類類型、接口類型、數組。
運行上述代碼:
結果:
ArgumentsTest.Emp(name=ke, age=22)
22
原參數值並沒有被改變。
引用類型參數被改變值的情況
改變apply方法的邏輯:
public static void apply(Emp emp){ emp.setName("li"); emp.setAge(44); }
結果:
ArgumentsTest.Emp(name=li, age=44)
原參數被改變了,為什么。
因為,方法中的參數雖然是原參數的副本,但是實例對象在堆中的數據只有一份,如果直接去修改對象的屬性值,就可以修改原參數值了。
類似的,對數組,可以修改單個數組元素的值,也是有效的。
對於包裝類,可以通過反射修改內部的value,可以達到相同的效果。