我正在编写一个像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?
答案 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)
现在obj
和test1
都引用obj name = 'Test1'
在doTest()
中,您创建了一个新对象,obj
指向它。但test1
仍指向主
name = Test1
的对象
因此,当调用 toString()时,会打印Test1
简而言之,
引用objtest1
始终使用name = Test1
答案 3 :(得分:0)
不应该像这样使用方法。要使用它,您应该将sysout移动到方法(doTest)中。然后当您需要该实例时,使用方法中所需的代码调用该方法。