Java对象引用/范围问题

时间:2009-03-08 02:59:08

标签: java oop scope

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

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

我循环遍历此数组的所有成员,并且:

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

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

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

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

2 个答案:

答案 0 :(得分: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对象。

答案 1 :(得分:2)

对象通过[ reference 值传递,其中值是引用](从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);