Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 覆盖此变量的正确方法是什么?_Java_Parameters_Variable Assignment - Fatal编程技术网

Java 覆盖此变量的正确方法是什么?

Java 覆盖此变量的正确方法是什么?,java,parameters,variable-assignment,Java,Parameters,Variable Assignment,在方法中覆盖现有变量时,下面类型为Thing的someThing,正确的方法是什么 doSomething(someThing); void doSomething(Thing thing){ //... thing = new Thing(...); // receives warning in Eclipse } 或 您的第一个示例不会更改调用者中的变量someThing。分配仅在doSomething方法中可见 第二个示例确实更改了调用者中的内容 因此,如果您想更改调用

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

doSomething(someThing);

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


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

第二个示例确实更改了调用者中的
内容

因此,如果您想更改调用者中的
内容,那么选项2是可行的,而选项1不是

看看为什么会这样

假设以下代码,以及一个具有print方法和字符串成员的
Thing

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{data="hello"}
然后将引用存储在
one
中:

one *----- refs --------v
                       Thing{data="hello"}
在点
2
处输入
bar
时,将创建对同一对象的新引用:

one *----- refs --------v
                       Thing{data="hello"}
two *----- refs --------^
然后行
3
执行与行
1
相同的操作,即创建一个新的
对象:

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
超出范围,“bye”对象不再有任何引用它的内容(最终将被垃圾收集)


因此,在点
5
,正如您所看到的,
hello
将被打印-任何东西都不会改变
one
所指的对象。

ooh。。。我可能搞砸了这是为什么?是不是因为我在第一种情况下覆盖了对
某物的引用?
one *----- refs --------v
                       Thing{data="hello"}

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

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