在Java中通过值传递引用

时间:2014-10-04 10:10:00

标签: java pointers reference pass-by-value

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变量(这可能是这里使用的类的私有)吗?这不是一个缺陷吗?

2 个答案:

答案 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变量。

这意味着该任务实际上从未实际接近狗的名字,它仍引用前一个字符串。因此,它不会改变。