Field Overwrite在方法体中不起作用 - Java

时间:2013-10-07 06:35:03

标签: java variable-assignment overwrite

这是一个回到基础的问题(我认为)虽然让我难以理解我最近与一些朋友进行的编码项目。

以下是代码变体之一:

public class Test {

private String test;

public Test(){
    test = "tester";
    changeString(test);
}

public void changeString(String t){
    t = "blue apples";
}

public String getTest(){
    return test;
}

public static void main(String[] args){
    Test t = new Test();
    System.out.println(t.getTest());
}
}

为什么程序打印出“测试者”而不是“蓝苹果”?方法changeString(String)不应该将字段'test'变成“blue apples”吗?

感谢您的回复!

5 个答案:

答案 0 :(得分:1)

Java是按值传递的,不是通过引用传递的。因此,对传递的t字符串所做的更改不会反映在您的test字符串中。

public void changeString(String t){
    t = "blue apples";
    test = t; // Include this line to assign the value of `t` to `test`.
}

答案 1 :(得分:0)

你在做,

 test = "tester";
 changeString(test);

String在java中是不可变的。

public void changeString(String t){
    t = "blue apples";
}

在上面的行中,您要更改传递给该方法的参数的值,而不是test

要查看更改,请尝试

public void changeString(String t){
    t= "blue apples";
    test=t;  // now assigned the value
}

答案 2 :(得分:0)

首先,您将"Tester"分配给test。接下来,您致电changeString,将test

的引用传递给它

此方法只是将"blue apples"分配给t。这样做,它会在进行分配之前创建一个新的String。由于t是按值传递的,因此当方法返回

时,不会反映更改

相反,你需要做更像......的事情。

public void changeString(String t){
    text = t;
}

并使用changeString("blue apples");

public String changeString(){
    return "blue apples";
}

并使用test = changeString();

答案 3 :(得分:0)

字符串在JAVA中是不可变的。 Immutablity意味着一旦创建了一个实例,它就会保持不变。在你的情况下

  1. 在您的情况下,您创建了一个测试人员引用以指向新的字符串“Tester”
  2. 由于当您将对象传递给方法并尝试将引用重新分配给新的字符串“Blue Apples”时字符串是不可变的,因此您在方法范围内创建了一个指向蓝苹果的引用t。如果您打印过t,那么您将获得“蓝苹果”,因为t的范围直到该方法。
  3. 返回测试仪后,参考仍然指向相同的旧字符串“tester”,因此它会被打印出来。
  4. 与String一样,所有其他包装类也是不可变的。你会在Integer,Boolean对象

    中观察到相同的行为

答案 4 :(得分:-1)

这是因为String对象是不可变的,因此无法在赋值后更改其值。您可以使用StringBuffer或StringBuilder isntead