8

如果我有这样的成员变量(在类的主体中声明)

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

我遍历这个数组的所有成员,并且:

1) 将每个 Dot 对象传递给另一个类的函数,该函数:

2) 如果满足某些条件,则将其传递给第三类的另一个函数

3) 第三类改变了 Dot 对象的一些属性

那么当这个对象返回到原始/父类时,对其属性的这些更改是否会保留?或者它会被第二个/第三个函数视为局部变量吗?

4

2 回答 2

12

是的,对属性的更改将被保留。Java 是 100% 按值传递的,但是,当您传递一个对象时,传递的“值”实际上是一个指向该对象的指针。因此,当您更改方法中的对象时,您正在更改传入的实际对象。

也就是说,如果您有以下方法,那么调用方法将看到更改:

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对象。

于 2009-03-08T03:01:42.390 回答
2

对象通过 [参考 value 其中 value 是引用](从 Object 继承的东西),原始值(int、long、double 等)按值传递。

这意味着当原语从调用者传递到方法时,它会被复制,而对于对象,则传递 [ ] 引用的值。

这反过来意味着当一个对象被一个方法改变时,调用者会看到这些变化,因为它引用了同一个对象。

相反,当一个方法改变一个原语时,调用者看不到变化,因为该方法正在处理一个副本。

【修改原因】

如果 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);

于 2009-03-08T03:35:39.500 回答