在java中更改对象的值

时间:2013-12-21 19:59:27

标签: java

我正在编写一个像bellow这样的简单应用程序:

public class Test1 {
String name;
public Test1(String name) {
this.name=name;
}

public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}

 @Override
 public String toString() { 
    return name;
}
}

并且

public class Test2 {

/**
 * @param args
 */
public static void main(String[] args) {
    for(int i=0;i<10;i++)
    {
        if(i>6)break;
    }
    Test2 test2= new Test2();
    Test1 test1= new Test1("Test1");
    test2.doTest(test1);
    System.out.println(test1);

}


public void doTest(Test1 test1)
{
    test1= new Test1("Test2");
}
}

当我将test1对象引用传递给doTest并将新值重新分配给该对象时,我相信avobe程序的输出将是Test2。但它仅作为Test1。似乎在doPost中创建的新对象是该方法的本地对象,并且不会影响外部。但是在这里我传递对象的引用,为什么对象的值不会更改为Test2?

4 个答案:

答案 0 :(得分:3)

它不会改变,因为您正在更改方法内部的引用,而不是对象的状态。

方法和构造函数参数始终按值传递,而使用引用变量,值是引用本身。如果更改方法内部的引用赋值,它所做的只是重新分配对技术上是局部变量的参数的引用,并且它不会影响原始变量指向的引用。

如果改为名为test1.setName("Test2")的方法:

public void doTest(Test1 test1) {
  test1.setName("Test2");
}

结果会完全不同,因为现在您要更改引用对象的状态

答案 1 :(得分:2)

您无法更改方法范围内第一个对象的引用。意味着赋予doTest的对象将仅用作输入。

你可以做的是将新对象作为方法的结果返回,并在外面使用新对象。

类似的东西:

public Test1 doTest(Test1 test1) {
    // do what you need to do with test1
    // ...
    return new Test1("Test2");
}

在外面你会有类似的东西:

test1 = test2.doTest(test1); // here you are overwriting the reference 
                             // with the version returned from the 
                             // method invocation

这种方法可以在许多java API中看到,一个例子是java.util.Collections.unmodifiableList方法,它成为一个列表作为参数,并给出其他结果。

答案 2 :(得分:0)

为了理解目的,我们可以将 doTest()的参数重命名为obj

public void doTest(Test1 obj) {
   obj = new Test1("Test2");
}
  • 当您致电 doTest test2.doTest(test1);时,您正在通过copy of reference (test1)

  • 现在objtest1都引用obj name = 'Test1'

  • doTest()中,您创建了一个新对象,obj指向它。但test1仍指向主

  • name = Test1的对象
  • 因此,当调用 toString()时,会打印Test1

  

简而言之,test1始终使用name = Test1

引用obj

答案 3 :(得分:0)

不应该像这样使用方法。要使用它,您应该将sysout移动到方法(doTest)中。然后当您需要该实例时,使用方法中所需的代码调用该方法。