Dog.setName("Kutta"); // this is how you call a setter method
String Naam = Dog.getName();
System.println(Naam); //Kutta
Naam = "Kutte ki Ma";
System.println(Dog.getName()); // Is this *Kutte ki Ma* or is it *Kutta*?
为什么?如果Java按值传递引用,那么Naam是否应该指向Dog.getName()?如果是这种情况,如果Naam被修改,那么不应该直接修改Dog对象的Name变量(这可能是这里使用的类的私有)吗?这不是一个缺陷吗?
答案 0 :(得分:1)
以上都不是,因为此处发布的代码从未设置狗的名字。如果你打电话
Dog.setName("Kutta");
Java是按值传递的(但是Object
的值是它的引用)。 但是,String
在Java中是不可变的,您无法更新对其他实例持有的String
的引用。
如果您使用StringBuilder
,可能会执行类似的操作,
public static void main(String args[]) {
Dog d = new Dog();
d.getName().append("Kutta");
StringBuilder Naam = d.getName();
System.out.println(Naam); //Kutta
Naam.setLength(0);
Naam.append("Kutte ki Ma");
System.out.println(d.getName());
}
static class Dog {
private StringBuilder sb = new StringBuilder();
StringBuilder getName() {
return sb;
}
}
你的期望是什么。
答案 1 :(得分:1)
由于字符串为immutable,因此当您键入Naam = "Kutte ki Ma";
时,您不会更改现有字符串对象,而是创建一个新字符串并分配给Naam
变量。
这意味着该任务实际上从未实际接近狗的名字,它仍引用前一个字符串。因此,它不会改变。