如果我将一个对象传递给一个方法,并且我在该方法中更改了该对象,它是否会保留其更改? 我不确定我是否说得对,所以我举一个例子:
public void methodThatChangesX(ClassWithVariableX var) {
var.x = 5;
}
ExampleClass var = new ExampleClass();
//ExampleClass's x's default is 6
methodThatChangesX(var);
System.out.println("x = " + var.x);
var&x 39s x是5还是6?有这个原因吗?
答案 0 :(得分:4)
值为5,但此行为仅适用于类类型
如果传递基本类型的参数(例如int
),则将在方法内处理副本。
事实上,即使传入的类型参数实际上只是对同一对象的新引用,所以如果不是var.x = something
,那么就说var = something
,这不会最终改变调用者的var
。
ETA:对那里真正发生的事情有一些深入的解释:
答案 1 :(得分:2)
值为5.尽管所有参数都是按值传递的,但在<? extends Object>
的情况下,?
的值是引用Object
的地址,因此发生了什么当你传递Object
时,它的地址是按值传递的。这意味着如果您使用Object
,那么它的地址与传递的地址相同,所以当您无法为其分配new
Object
时,您几乎可以按照自己的意愿行事具有其属性,这将改变原始Object
的状态。
考虑这个类示例:
public class Test {
public int i;
public Test(int i) {
this.i = i;
}
}
和这个静态方法:
public static void changeAtrib(Test t) {
t.i = 0;
t = new Test(7);
}
现在不要创建Test
的实例并将其传递给我们的方法:
Test test = new Test(5);
changeAtrib(test);
当方法运行时,里面的变量t
保存原始test
的地址值。
方法的第一行是:t.i = 0;
哪个使用i
的原始地址引用test
,这意味着i
也会在原始test
中发生变化。
现在让我们来看看第二行:t = new Test(7);
现在请记住t
保存test
的地址值,而t = new Test(7);
只创建一个新的Test
对象并将其地址分配给t
,该操作具有对test
没有影响,因为它只会更改值t
暂停并使t
引用新对象。