为什么字符串不更新?

时间:2014-03-18 16:11:53

标签: java string

我尝试了这段代码。

public class CopyOfMain {
    public static void main(String[] args) {

        CopyOfMain c = new  CopyOfMain();

        Emp e = new Emp();
        e.setName("Mick");
        c.edit(e);

        System.out.println(e.getName());

        String s = new String("hello");
        c.edit(s);

        System.out.println(s);

    }

    public void edit(Emp s) {
        s.setName("mickey");
    }


    public void edit(String s) {
        s.concat("world");
    }
}

Output

米奇 喂

为什么emp中的名字发生了变化?但是没有字符串参数? 是因为它是不可变的类吗?

如果是,那么String中的name也是immutable

那么名字如何更新但不是第二名?

感谢。

2 个答案:

答案 0 :(得分:2)

    Emp e = new Emp();
    e.setName("Mick");
    c.edit(e);

更新,因为 - 在Java"对象的引用按值传递"你的对象是" Mutable"这意味着它的价值可以改变。您正在用另一个字符串替换一个字符串并返回该对象。所以,它反映了。您将String放在一个对象中,引用会更改原始对象。

String s = new String("hello");
        c.edit(s);

字符串是不可变的。除非您将它们封装在另一个对象中或返回它们(它将返回一个新的String,而不是原始的String)"你不能改变它的价值

答案 1 :(得分:1)

是的,String在Java中是不可变的。

在第一个edit方法中,您在setName对象上调用方法调用Emp,这可能会将其对员工姓名的内部引用更改为{{ 1}}。这是更改"mickey"的正确方法 - 让它引用另一个String

但是,String方法不会更改concat的内容;它返回另一个代表连接的s,你忽略它。但即使你说过

String

这只会将本地参考s = s.concat("world"); 更改为新s;它不会更改String中的原始String s。为此,您需要更改原始引用,并且只能在main方法本身中执行此操作,因为它已经声明了。

main