可以在Java中更改这样的String值吗?

时间:2016-03-06 17:16:45

标签: java string

我认为一旦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中的字符串一旦初始化就无法改变?

3 个答案:

答案 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