我认为一旦String初始化为某个值,你就无法改变它的值?显然,我可以在我的程序中。
public class Pekka {
public static void main (String[] args){
Person p = new Person("Pekka Mikkola", "040-123123");
System.out.println(p.getName());
System.out.println(p.getNumber());
System.out.println(p);
p.changeNumber("000-0001");
System.out.println(p);
}
}
class Person {
private String name, number;
Person(String name, String number){
this.name = name;
this.number = number;
}
public String getName(){
return name;
}
public String getNumber(){
return number;
}
public void changeNumber(String newNumber){
number = newNumber;
}
@Override
public String toString() {
return getName() + " number: " + getNumber();
}
}
我的输出:
Pekka Mikkola
040-123123
Pekka Mikkola number: 040-123123
Pekka Mikkola number: 000-0001
所以我显然可以根据需要多次更改字符串数字的值。怎么会?我可以改变变量" number"的值。在changeNumber方法中,即使它已经被初始化了?我认为Java中的字符串一旦初始化就无法改变?
答案 0 :(得分:2)
您无法更改字符串的值*,但您可以为变量指定一个新的不同字符串(除非变量为final
)。
您的代码正在为number
变量分配一个新字符串:
public void changeNumber(String newNumber){
number = newNumber;
}
旧字符串未被修改 - 它被丢弃。
*
实际上, ways to do this, using reflection,但它是not usually a good idea。
答案 1 :(得分:0)
您不是要更改String的值,而是将变量number
分配给新的String。
答案 2 :(得分:0)
Java中的字符串是不可变的,因为一旦分配了字符串,通常就不能更改其值。但是,变量指向的分配可以改变。
例如,请考虑以下事项:
String test = "test";
在堆上分配内存以存储字符串"test"
。现在,如果运行以下代码:
test = "test2";
然后进行新的分配以存储字符串"test2"
,变量test
现在指向该分配。 String的分配值不会更改,但变量始终可以指向不同的分配。使String变量的值无法更改的唯一方法是将其声明为final
。