[英]Java. Argument does not change
static void f(String s)
{
s = "x";
}
public static void main(String[] args) {
String s = null;
f(s);
}
為什么調用f(s)后s的值為null而不是“ x”?
因為s
是參考。 您將該引用的副本傳遞給該方法,然后在該方法內部修改該副本。 原件不變。
將Object變量傳遞給Java中的函數時,它通過引用傳遞。 如果在函數中為對象分配新值,則將覆蓋傳入的引用,而不會修改任何仍保留原始引用的調用代碼看到的值。
但是,如果執行以下操作,則值將被更新:
public class StringRef
{
public String someString;
}
static void f(StringRef s)
{
s.someString = "x";
}
public static void main(String[] args)
{
StringRef ref = new StringRef;
ref.someString = s;
f(ref);
// someString will be "x" here.
}
在函數f()中,該值為“ x”。 在此函數之外,s的值為null。 參考數據類型(例如對象)通過值傳遞,請參見此處 (請閱讀“傳遞參考數據類型參數”一節)
假設s
是String
類型,這是引用類型(不是原始類型):
s = "x";
並不意味着“變換的東西s
是指到值"x"
”。 (在可能存在null
的語言中,它無論如何都不能真正做到這一點,因為沒有實際的“ s
所指事物”來進行轉換。)
實際上,它的意思是“使s
停止引用其當前引用的事物,而開始引用值"x"
”。
該名s
在f()
是本地的f()
所以一旦函數返回時,該名稱是無關緊要的; main()
的名稱s
是一個不同的名稱,並且仍然是null
引用。
傳遞的參數唯一要做的就是使f()
s
從null
開始。
如果您沒有使用null
:(
實際上,您並沒有更改要創建的值,而是完全不同的。如果您在方法中更改對象的屬性,那么我的引用將被更改。 但是您正在創建新對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.