簡體   English   中英

Java object 參考/范圍問題

[英]Java object reference/scope question

如果我有這樣的成員變量(在類的主體中聲明)

private Dot[] dots=new Dot[numDots];

我遍歷這個數組的所有成員,並且:

1)將每個點 object 傳遞給另一個 class 的 function,其中:

2)如果滿足某些條件,將其傳遞給第三個 class 的另一個 function

3) 第三個 class 改變了點 object 的一些屬性

那么當這個 object 返回到原始/父 class 時,對其屬性的這些更改會保留嗎? 或者它會被第二個/第三個函數視為局部變量嗎?

是的,對屬性的更改將被保留。 Java 是 100% pass-by-value,但是,當您傳遞 object 時,傳遞的“值”實際上是指向 object 的指針。 因此,當您在方法中更改 object 時,您正在更改傳入的實際 object。

也就是說,如果您有以下方法,那么調用方法將看到更改:

private void updateMyDot(final Dot aDot) {
  aDot.dotColor = new Color(255,255,255);
}

但是如果您執行以下操作,則調用方法將不到更改。

private void updateMyDot(/* not final */ Dot aDot) {
  aDot = new Dot();
  aDot.dotColor = new Color(255,255,255);
}

在第二個示例中,調用者不會看到任何更改,也不會看到新創建的Dot object。

對象通過 [ 參考 value 其中 value 是引用](從 Object 繼承的東西),原始值(int、long、double 等)按值傳遞。

這意味着當原語從調用者傳遞到方法時,它會被復制,而對於 object,會傳遞 [] 引用的

這反過來意味着當 object 被某個方法突變時,調用者會看到這些更改,因為它引用了相同的 object。

相反,當一個方法改變一個原語時,調用者看不到變化,因為該方法正在處理一個副本。

【修改原因】

如果 Java 通過引用傳遞,那么您可以這樣做:

Object x;

x = new Integer(42);
foo(x);
System.out.println(x.getClass()); // pass by reference would have it print out java.lang.Float

其中 foo 定義為:

void foo(Object o)
{
   o = new Float(43);
}

由於 Java 通過值o = new Float(43); 是允許的 - 但調用者中的值將保持為new Integer(42);

暫無
暫無

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

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