0

这是一个直接回到基础的问题(我认为),尽管我在最近与几个朋友进行的编码项目中遇到了困难。

这是代码变体之一:

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());
}
}

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

提前感谢您的回复!

4

5 回答 5

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`.
}
于 2013-10-07T06:38:56.837 回答
0

你在做,

 test = "tester";
 changeString(test);

字符串在java中是不可变的。

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

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

看看改变试试

public void changeString(String t){
    t= "blue apples";
    test=t;  // now assigned the value
}
于 2013-10-07T06:36:48.723 回答
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();

于 2013-10-07T06:41:16.590 回答
0

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

  1. 在您的情况下,您创建了一个测试器引用以指向一个新的字符串“测试器”
  2. 由于当您将对象传递给方法并尝试将引用重新分配给新字符串“Blue Apples”时,字符串是不可变的,因此您所做的是在指向蓝苹果的方法范围内创建了一个引用 t。如果你已经打印了 t,你就会得到“Blue Apples”,因为 t 的范围是直到方法。
  3. 返回 tester 后,引用仍然指向相同的旧字符串“tester”,因此它被打印出来。

与 String 一样,所有其他包装类也是不可变的。您会观察到与 Integer、Boolean 对象相同的行为

于 2013-10-07T06:44:36.560 回答
-1

发生这种情况是因为 String 对象是不可变的,因此无法在分配后更改其值。您可以使用 StringBuffer 或 StringBuilder 不是

于 2013-10-07T06:38:54.000 回答