[英]Passing params to methods in Java
我對一件簡單的事情感到困惑 - 將參數傳遞給方法並更改它們的值......我最好給你一些代碼:
public class Test {
public static void main(String[] args) {
Integer val = new Integer(41);
upd(val);
System.out.println(val);
Man man = new Man();
updMan(man);
System.out.println(man.name);
}
static void upd(Integer val) {
val = new Integer(42);
}
static void updMan(Man man) {
man.name = "Name";
}
static class Man {
String name;
}
}
你能解釋一下為什么我傳給的Integer對象在Man對象時沒有更新嗎? 是不是通過引用傳遞的Integer和Man對象(由於它們的非原始性質)?
因為對於Integer
您正在創建一個新對象。 對於Man
你只需更改其中一個值,對象man
保持不變。
考慮以下:
static void updMan(Man man) {
man = new Man();
man.name = "Another Man";
}
這也不會改變你的初始man
。
- 編輯
您可以通過以下方式“模擬” Integer
的可變性:
static void upd(Integer val) {
try {
Field declaredField = val.getClass().getDeclaredField("value");
declaredField.setAccessible(true);
declaredField.set(val, 42);
} catch (Exception e) {
}
}
它被稱為Pass by value 。 當您將一些對象傳遞給dome方法時,Java會創建對該對象的引用副本。 如果在進入方法體后立即檢查對象的哈希碼,它將與傳遞的對象的哈希碼相同。 但是當你在方法中更改它時,對象更改和引用不再指向同一個對象。
編輯 :代碼示例
public class TestPass {
public static void main(String[] args) {
String ss= "sample";
System.out.println("Outside method: "+ss.hashCode());
method(ss);
}
static void method(String s){
System.out.println("Inside method: "+s.hashCode());
s+='!';
System.out.println("Inside method after object change: "+s.hashCode());
}
}
輸出:
Outside method: -909675094
Inside method: -909675094
Inside method after change: 1864843191
作為參數在Java中的對象通過引用副本作為參數傳輸 - 因此,如果您通過引用副本更改對象 - 您將更新對象。
如果使用upd(Integer val)
方法,則創建一個新的Integer
對象,以便引用副本現在指向一個新對象,而不是舊對象。 因此,更改該對象不會影響原始對象。
man.name = "Name";
實際上,您正在更改同一對象中的某些內容,而不是像在整數情況下那樣創建新對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.