为什么java使用pass-by-value和pass-by-reference?

时间:2012-12-19 12:08:00

标签: java parameter-passing pass-by-reference pass-by-value

  

可能重复:
  Is Java “pass-by-reference”?

也许我错过了一些东西......但我真的不明白为什么Java同时使用pass-by-value和pass-by-reference。 为什么不只使用一种范式?

2 个答案:

答案 0 :(得分:9)

没有。 Java纯粹是按值传递。处理对象时传递的值是对象引用,但是 nothing 与“按引用传递”相关。

传递引用意味着函数可以传递给变量并在调用函数中更改该变量的内容。这在Java中不存在。

例如:

void foo() {
    int a;

    a = 42;
    bar(a);
    System.out.println(a); // Will ALWAYS be 42
}

void bar(int b) {
    b = 67;
}

与C ++形成对比, 具有传递参考:

// C++ code
void foo() {
    int a;

    a = 42;
    bar(a);
    cout << a; // 67?!
}
void bar(int& a) { // <== Note the &
    a = 67;
}

Java与C ++中的&(或C#中的out / ref)不相同。

您可能正在考虑对象引用,它是“引用”一词的完全单独使用,而不是引用传递中的“引用”。让我们看一下对象的例子:

void foo() {
    Object o1, o2;

    o1 = new Object();
    o2 = o1;
    bar(o1);
    System.out.println(o1 == o2); // Will ALWAYS be true
}

void bar(Object o) {
    o = new Object();
}

如果Java有引用传递(我们用它将对象变量传递给bar),==中的foo将为false。但事实并非如此,而且没有办法实现这一目标。

对象引用允许您更改传递给函数的对象的状态,但是您无法更改调用函数中包含它的变量。

答案 1 :(得分:-1)

Java始终是“按值传递”。所以原语和Object的(引用)都是按值传递的。

修改

是的,对象不是直接传递的,我们总是用它们的引用来引用它们。所以Object的引用按值传递。