我分了三種類型的參數進行測試
一、基本類型
public static void main(String[] args) { System.out.println("驗證基本類型int作為參數傳入方法中進行修改后原值是否會改變"); int item1 = 1; System.out.println("int:改變前值為" + item1); changeInt(item1); System.out.println("int:類型改變后值為" + item1); System.out.println("-------------------------------------------------------"); } private static void changeInt(int param) { param = 10; System.out.println("int:方法中值為" + param); }
打印結果:
這里我用的是int,基本類型算是比較簡單明了,傳入方法的參數是int item1的值拷貝,所以方法內改變的不是item1。
二、 引用類型
public static void main(String[] args) { System.out.println("驗證引用類型ItemModel作為參數傳入方法中進行修改后原值是否會改變"); System.out.println("第一次測試"); ItemModel item4 = new ItemModel("xiao ming"); System.out.println("ItemModel:改變前對象的hashCode為" + System.identityHashCode(item4) + " 值為" + item4.toString()); changeItemModel1(item4); System.out.println("ItemModel:改變后對象的hashCode為" + System.identityHashCode(item4) + " 值為" + item4.toString()); System.out.println("第二次測試"); ItemModel item5 = new ItemModel("xiao ming"); System.out.println("ItemModel:改變前對象的hashCode為" + System.identityHashCode(item5) + " 值為" + item5.toString()); changeItemModel2(item5); System.out.println("ItemModel:改變后對象的hashCode為" + System.identityHashCode(item5) + " 值為" + item5.toString()); System.out.println("-------------------------------------------------------"); } private static void changeItemModel1(ItemModel param) { param.setName("xiao hong"); System.out.println("ItemModel:方法中對象的hashCode為" + System.identityHashCode(param) + " 值為" + param); } private static void changeItemModel2(ItemModel param) { param = new ItemModel(); param.setName("xiao hong"); System.out.println("ItemModel:方法中對象的hashCode為" + System.identityHashCode(param) + " 值為" + param); } class ItemModel { private String name; public ItemModel() { } ItemModel(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "ItemModel{" + "name='" + name + '\'' + '}'; } }
打印結果:
這里我打印了ItemModel的hashCode和toString方法,我們可以看到在第一次測試中,改變前、方法中、改變后對象的hashCode的是一樣的,所以我們可以確認傳入方法的是對象的引用,所以這一次原對象發生改變。在第二次測試的方法中,多了一行
param = new ItemModel();
這里一行是新創建了一個ItemModel對象,param被賦予了新的引用地址,所以能看到打印出的hashCode和原本是不一樣的,所以第二次測試中原對象並沒有被改變。
三、String 和 Integer
這里提一點,String和Integer對象都是不可改變的,每次重新賦值都是指向一個新的引用而已(可以參考上面的第二次測試)
public static void main(String[] args) { System.out.println("驗證引用類型Integer作為參數傳入方法中進行修改后原值是否會改變"); Integer item2 = new Integer(1); System.out.println("Integer:改變前對象的hashCode為" + System.identityHashCode(item2) + " 值為" + item2); changeInteger(item2); System.out.println("Integer:改變后對象的hashCode為" + System.identityHashCode(item2) + " 值為" + item2); System.out.println("-------------------------------------------------------"); System.out.println("驗證引用類型String作為參數傳入方法中進行修改后原值是否會改變"); String item3 = "xiao ming"; System.out.println("String:改變前對象的hashCode為" + System.identityHashCode(item3) + " 值為" + item3); changeString(item3); System.out.println("String:改變后對象的hashCode為" + System.identityHashCode(item3) + " 值為" + item3); System.out.println("-------------------------------------------------------"); } private static void changeInteger(Integer param) { param = 10; System.out.println("Integer:方法中對象的hashCode為" + System.identityHashCode(param) + " 值為" + param); } private static void changeString(String param) { param = "xiao hong"; System.out.println("String:方法中對象的hashCode為" + System.identityHashCode(param) + " 值為" + param); }
打印結果:
所以像這種不可變的引用類型,雖然傳入的也是對象的引用,但是無論在方法中如何操作,原對象的值是不會發生變化的