簡體   English   中英

如何在Java中識別傳遞值或傳遞引用?

[英]How to identify pass-by-value or pass-by reference in Java?

請原諒我的問題。我在網上遇到了這段代碼片段:

public class Person {

public static void main(String [] args)
{
    StringBuffer a = new StringBuffer("A");
    StringBuffer b = new StringBuffer("B");
    operate(a,b);
    System.out.println(a+","+b);
}


static void operate(StringBuffer x, StringBuffer y)
{
    y.append(x);
    y=x;

 }
}

我確定運行的輸出應該是A,A,但是正確的輸出應該是A,BA,請專家幫我理解為什么b的值仍然是AB? 為什么“ y.append(x)”會影響b的值,但不會影響“ y = x”? 那就是我感到困惑的地方。

提前致謝。

簡短的回答是Java參數是按值傳遞的,所以在最后的分配operate沒有任何影響。

事件的詳細順序如下:

  1. ab初始化為兩個StringBuffer對象。 讓我們這樣寫

      a -> S1{"A"} b -> S2("B") 
  2. 計算operator調用參數的(平凡)參數表達式,得出S1 {“ A”}和S2 {“ B”}。

  3. 調用開始,並且兩個引用被分配給局部變量xy 現在的狀態是:

      a -> S1{"A"} x -> | b -> S2("B") y -> | 
  4. y.append(x)調用修改S2對象:

      a -> S1{"A"} x -> | b -> S2("BA") y -> | 
  5. y = x; 執行分配:

      a -> S1{"A"} x -> | y -> | b -> S2("BA") 
  6. operate方法返回,導致xy超出范圍。

      a -> S1{"A"} b -> S2("BA") 

要注意的關鍵是,在第5步中,我們不更改S2對象的內容。 相反,我們只是將y更改為引用另一個對象。

在該方法中, y=x行僅更改局部變量y而不會影響調用方作用域中的b變量。

由於無法在Java中傳遞指向變量的指針,因此在operate方法中更改b變量會有點困難。 您可以:

  • 返回它: b = operate...
  • 更改其內容(但這將是副本)

Java不使用按名稱 調用按引用調用

void replace(Anything x) {
  x = y;
}

根據定義 ,什么都不做,因為x是一個變量,而不是調用變量的別名。 對變量x任何更改都限於方法范圍內。 請注意, x.setSomething可能仍會修改x引用的內容

這實際上適用於大多數編程語言。 它避免了錯誤,並且有多種方法可以顯式地獲得所需的結果。

Java總是按值調用 即使使用引用,技術上也將它們作為值(對象引用類型)傳遞。

即,變量“ Integer example; ”在技術上不是Integer ,而是對Integer實例的引用(可以為null )。 引用被復制(按值調用),但是當然它之后仍引用同一對象。 因此,您可以修改對象,但不能更改實際的引用,因為它只有一個副本。

讓試運行方法:

  1. 參考狀態為a -> A, x -> A, b -> B, y -> B.

  2. append執行a- a -> A, x -> A, b -> BA, y -> BA.

  3. y=x執行a- a -> A, x -> A, b -> BA, y -> A.

現在,打印輸出應該是什么? :-)

要點是,

Java是按價值傳遞

暫無
暫無

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

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