簡體   English   中英

Java。 爭論沒有改變

[英]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。 參考數據類型(例如對象)通過值傳遞,請參見此處 (請閱讀“傳遞參考數據類型參數”一節)

假設sString類型,這是引用類型(不是原始類型):

s = "x";

並不意味着“變換的東西s是指到值"x" ”。 (在可能存在null的語言中,它無論如何都不能真正做到這一點,因為沒有實際的“ s所指事物”來進行轉換。)

實際上,它的意思是“使s停止引用其當前引用的事物,而開始引用值"x" ”。

該名sf()是本地的f()所以一旦函數返回時,該名稱是無關緊要的; main()的名稱s是一個不同的名稱,並且仍然是null引用。

傳遞的參數唯一要做的就是使f() snull開始。

如果您沒有使用null :(

實際上,您並沒有更改要創建的值,而是完全不同的。如果您在方法中更改對象的屬性,那么我的引用將被更改。 但是您正在創建新對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM