Java 是“按引用传递”还是“按值传递”?

新手上路,请多包涵

我一直认为 Java 使用 pass-by-reference

但是,我看到 一篇博客文章 声称 Java 使用 pass-by-value

我不认为我理解他们所做的区分。

解释是什么?

原文由 user4315 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 424
1 个回答

术语“按值传递”和“按引用传递”在计算机科学中具有特殊的、 精确定义 的含义。这些含义与许多人第一次听到这些术语时的直觉不同。这个讨论中的大部分混乱似乎都来自这个事实。

术语“按值传递”和“按引用传递”是指 变量。 按值传递意味着将变量的 传递给函数/方法。传递引用意味着对该变量的 引用 被传递给函数。后者为函数提供了一种更改变量内容的方法。

根据这些定义,Java 始终是 按值传递的。不幸的是,当我们处理包含对象的变量时,我们实际上是在处理称为 引用 的对象句柄,它们也是按值传递的。这种术语和语义很容易使许多初学者感到困惑。

它是这样的:

 public static void main(String[] args) {
    Dog aDog = new Dog("Max");
    Dog oldDog = aDog;

    // we pass the object to foo
    foo(aDog);
    // aDog variable is still pointing to the "Max" dog when foo(...) returns
    aDog.getName().equals("Max"); // true
    aDog.getName().equals("Fifi"); // false
    aDog == oldDog; // true
}

public static void foo(Dog d) {
    d.getName().equals("Max"); // true
    // change d inside of foo() to point to a new Dog instance "Fifi"
    d = new Dog("Fifi");
    d.getName().equals("Fifi"); // true
}

在上面的例子中 aDog.getName() 仍然会返回 "Max" 。 The value aDog within main is not changed in the function foo with the Dog "Fifi" as the object reference按值传递。 If it were passed by reference, then the aDog.getName() in main would return "Fifi" after the call to foo .

同样地:

 public static void main(String[] args) {
    Dog aDog = new Dog("Max");
    Dog oldDog = aDog;

    foo(aDog);
    // when foo(...) returns, the name of the dog has been changed to "Fifi"
    aDog.getName().equals("Fifi"); // true
    // but it is still the same dog:
    aDog == oldDog; // true
}

public static void foo(Dog d) {
    d.getName().equals("Max"); // true
    // this changes the name of d to be "Fifi"
    d.setName("Fifi");
}

在上面的例子中, Fifi 是调用 foo(aDog) 后狗的名字,因为对象的名字是在 foo(...) 中设置的 food --- 上执行的任何操作,出于所有实际目的,它们是在 aDog 上执行的,但它的值是 不可能 更改的变量 aDog 本身。

有关按引用传递和按值传递的更多信息,请参阅以下答案: https ://stackoverflow.com/a/430958/6005228。这更彻底地解释了两者背后的语义和历史,也解释了为什么 Java 和许多其他现代语言在某些情况下似乎同时做这两者。

原文由 erlando 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题