[英]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.