2012-04-20 110 views
1

当在方法中覆盖下面类型为Thing的现有变量someThing时,正确的方法是什么?什么是做这个变量覆盖的正确方法?

doSomething(someThing); 

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

someThing = doSomething(someThing); 

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

回答

2

第一个样品没有在调用者改变变量someThing。该分配仅在doSomething方法中可见。

第二个示例确实在调用者中更改了someThing

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

请参阅Is Java "pass-by-reference" or "pass-by-value"?为什么这样工作。

假设下面的代码和Thing有一个打印方法和一个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 

1分配首先创建一个新的Thing对象:

     Thing{data="hello"} 

然后存储在one到一个参考:当你点2进入bar

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

,将创建对同一对象的新引用:

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

然后线3不一样的东西线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"} 

注意只有two被修改。该分配会改变two所引用的内容。

当你从bar返回,在线4,two超出范围,“再见”事情不再有任何引用它(并最终将被垃圾回收)。

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

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

所以在点5,你可以看到,hello将被打印出来 - 什么都没改变了one指对象。

+0

Oooh ...我可能搞砸了 – Theodor 2012-04-20 07:30:27

+0

_why_是这个吗?是否因为我在第一种情况下覆盖了对'someThing'的引用? – Theodor 2012-04-20 07:34:10

相关问题