1

someThing在方法中覆盖以下类型的现有变量时,Thing正确的方法是什么?

doSomething(someThing);

void doSomething(Thing thing){
    //...
    thing = new Thing(...); // receives warning in Eclipse
}

或者

someThing = doSomething(someThing);

Thing doSomething(Thing thing){
    //...
    return new Thing(...);
}
4

1 回答 1

2

您的第一个示例不会更改someThing调用者中的变量。分配仅在doSomething方法中可见。

第二个样本someThing在调用者中确实发生了变化。

所以如果你想改变someThing调用者,选项2是可行的,而选项1是不可行的。

请参阅Java 是“按引用传递”还是“按值传递”?为什么会这样。

假设下面的代码,并且 aThing有一个 print 方法和一个 String 成员。

void foo() {
  Thing one = new Thing("hello");  // 1
  bar(one);
  one.print();                   // 5
}

void bar(Thing two) {            // 2
  two = new Thing("bye");        // 3
}                                // 4

point 处的赋值1首先创建了一个新的 Thing 对象:

                       Thing{data="hello"}

然后将引用存储在one

one *----- refs --------v
                       Thing{data="hello"}

当您bar在点输入时2,会创建对同一对象的新引用:

one *----- refs --------v
                       Thing{data="hello"}
two *----- refs --------^

然后 line和 line3做同样的事情1,即创建一个新Thing对象:

one *----- refs --------v
                       Thing{data="hello"}
two *----- refs --------^

                       Thing{data="bye"}

然后将对该新对象的引用存储在two

one *----- refs --------v
                       Thing{data="hello"}

two *----- refs --------v
                       Thing{data="bye"}

注意 onlytwo被修改。分配改变了two所指的内容。

当您从bar, at line返回时4two超出范围,“再见”事物不再有任何引用它的东西(最终将被垃圾收集)。

one *----- refs --------v
                       Thing{data="hello"}

                       Thing{data="bye"} // dead, will be collected

因此5,正如您所看到的,hello将打印点 - 没有任何东西改变了所one引用的对象。

于 2012-04-20T07:28:45.943 回答