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

Gei*_*ond 1 java parameter-passing pass-by-reference pass-by-value

可能重复:
Java是"传递引用"吗?

也许我错过了一些东西......但是我无法理解为什么Java同时使用pass-by-value和pass-by-reference.为什么不只使用一种范式?

T.J*_*der 9

它没有.Java纯粹是按值传递.处理对象时传递的值是对象引用,但这与"按引用传递" 无关.

Pass-by-reference意味着函数可以传递给变量并在调用函数中更改该变量的内容.这在Java中不存在.

例如:

void foo() {
    int a;

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

void bar(int b) {
    b = 67;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Java与&C++(或out/ refC#)中没有相同的东西.

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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

对象引用允许您更改传递给函数的对象的状态,但不能更改调用函数中包含它的变量.