[英]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
沒有任何影響。
事件的詳細順序如下:
a
和b
初始化為兩個StringBuffer對象。 讓我們這樣寫
a -> S1{"A"} b -> S2("B")
計算operator
調用參數的(平凡)參數表達式,得出S1 {“ A”}和S2 {“ B”}。
調用開始,並且兩個引用被分配給局部變量x
和y
。 現在的狀態是:
a -> S1{"A"} x -> | b -> S2("B") y -> |
y.append(x)
調用修改S2對象:
a -> S1{"A"} x -> | b -> S2("BA") y -> |
y = x;
執行分配:
a -> S1{"A"} x -> | y -> | b -> S2("BA")
operate
方法返回,導致x
和y
超出范圍。
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
)。 引用被復制(按值調用),但是當然它之后仍引用同一對象。 因此,您可以修改對象,但不能更改實際的引用,因為它只有一個副本。
讓試運行方法:
參考狀態為a -> A, x -> A, b -> B, y -> B.
append
執行a- a -> A, x -> A, b -> BA, y -> BA.
y=x
執行a- a -> A, x -> A, b -> BA, y -> A.
現在,打印輸出應該是什么? :-)
要點是,
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.