为什么java的同时使用传递按值传递和按引用? [重复](Why does java use b

2019-10-17 12:48发布

可能重复:
就是Java“传递按引用”?

也许我失去了一些东西......但我真的不能明白为什么Java使用两通按值传递和按引用。 为什么不能只用一个模式?

Answer 1:

事实并非如此。 Java是纯粹传递的价值。 当你处理一个对象传递的值对象的引用,但没有任何与“按引用传递”。

通过按引用意味着一个函数可以被传递的变量,改变在调用函数变量的内容。 这并不在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 ++(或out / ref在C#)。

你可能在想的对象引用,这是一个完全独立使用单词“参考”的比通通过引用的“参考”的。 让我们来看看在使用对象的例子:

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会是假的。 但它不是,也没有办法让它如此。

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



Answer 2:

Java的始终是“值传递”。 因此,原语和对象的(参考)两者都按值传递。

编辑

是啊,对象不是直接传递,我们总是指他们与他们的参考。 所以对象的引用是按值传递。



文章来源: Why does java use both pass-by-value and pass-by-reference? [duplicate]