传递给方法的对象是否需要返回才能更改?

时间:2015-02-26 22:18:20

标签: java oop object

如果我将一个对象传递给一个方法,并且我在该方法中更改了该对象,它是否会保留其更改? 我不确定我是否说得对,所以我举一个例子:

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?有这个原因吗?

2 个答案:

答案 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引用新对象。