我尝试了这段代码。
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
?
那么名字如何更新但不是第二名?
感谢。
答案 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