【问题标题】:Passing References by Value in Java [duplicate]在Java中按值传递引用[重复]
【发布时间】:2014-11-29 06:26:39
【问题描述】:
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变量(可能是这里使用的类的私有变量)不应该直接修改吗?这不是缺陷吗?

【问题讨论】:

  • Dog.getName() = "Kutta"; 会编译吗?
  • 您需要先发布编译的代码,然后才能讨论执行时行为...请发布一个简短但完整的程序来演示该问题。
  • @hrishirc 看看这个帖子:stackoverflow.com/questions/40480/… 特别注意第二好的答案,它详细解释了你需要知道的一切。
  • 也改变 Dog.setName() = "Kutta"; to Dog.setName("Kutta");
  • 这只狗的名字叫“狗”?多么有创意:-(

标签: java pointers reference pass-by-value


【解决方案1】:

因为字符串是immutable,所以当您键入Naam = "Kutte ki Ma"; 时,您并没有更改现有的字符串对象,而是创建了一个新对象并将其分配给您的Naam 变量。

这意味着该分配实际上永远不会靠近狗的名字,它仍然引用前一个字符串。因此,它不会改变。

【讨论】:

  • 你认为他们的程序会执行吗?
  • 假设它是可变的而不是字符串,比如说一个 int?
  • @hrishirc int 是一个原语(所以这里没有引用),而IntegerObject 的包装器 int)是不可变的。
【解决方案2】:

以上都不是,因为您在此处发布的代码从未设置狗的名字。如果你确实打电话

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;
    }
}

如您所愿。

【讨论】:

    猜你喜欢
    • 2014-09-10
    • 2013-12-02
    • 2012-03-12
    • 2013-09-15
    • 2012-03-13
    • 2011-05-16
    • 2011-05-29
    • 1970-01-01
    • 2021-11-04
    相关资源
    最近更新 更多