通过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中的值传递引用

+6

'Dog.getName()=“Kutta”;'它会编译? – Rustam 2014-10-04 10:13:45

+0

您需要发布编译代码才能讨论执行时间行为......请发布一个简短但完整的程序来演示问题。 – 2014-10-04 10:16:18

+0

@hrishirc看看这个线程:http://*.com/questions/40480/is-java-pass-by-reference-or-pass-by-value特别注意第二个最好的答案,它解释详细所有你需要知道的。 – Alboz 2014-10-04 10:20:14

因为字符串是immutable,当你键入Naam = "Kutte ki Ma";你不改变现有的字符串对象,要创建一个新的和分配给您的Naam变量。

这是什么意思是指派从来没有实际去任何地方附近的狗的名字,仍然引用前一个字符串。因此,它不会改变。

+0

你认为他们的程序会执行吗? – Rustam 2014-10-04 10:20:12

+0

假设它是可变的,而不是一个字符串,比如一个int? – hrishirc 2014-10-04 10:20:19

+0

@hrishirc“int”是一个原语(那里没有引用)和“Integer”( 'int'的'Object'包装器)是不可变的。 – 2014-10-04 10:38:55

以上都不是,因为您在此处发布的代码从未设置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; 
    } 
} 

你似乎期待哪位呢。