通过Java中的值传递引用
问题描述:
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按值传递引用,那么不应该指向Dog.getName()?如果是这种情况,如果Naam被修改,Dog对象的Name变量是不是应该直接修改?这不是一个缺陷吗?通过Java中的值传递引用
答
因为字符串是immutable,当你键入Naam = "Kutte ki Ma";
你不改变现有的字符串对象,要创建一个新的和分配给您的Naam
变量。
这是什么意思是指派从来没有实际去任何地方附近的狗的名字,仍然引用前一个字符串。因此,它不会改变。
答
以上都不是,因为您在此处发布的代码从未设置Dog的名称。如果你确实叫
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;
}
}
你似乎期待哪位呢。
'Dog.getName()=“Kutta”;'它会编译? – Rustam 2014-10-04 10:13:45
您需要发布编译代码才能讨论执行时间行为......请发布一个简短但完整的程序来演示问题。 – 2014-10-04 10:16:18
@hrishirc看看这个线程:http://*.com/questions/40480/is-java-pass-by-reference-or-pass-by-value特别注意第二个最好的答案,它解释详细所有你需要知道的。 – Alboz 2014-10-04 10:20:14