Java是“pass-by-reference”还是“pass-by-value”?

问题:

我一直认为Java是通过按引用;不过我看过几篇博客文章(例如this blog)声称没有。我不认为我明白他们所做的区别。
有什么解释?

回答:

Java总是通过按值。不幸的是,他们决定把对象的位置称为“参考”。当我们传递对象的值时,我们将reference传递给它。这对初学者感到困惑。
就像这样:

public static void main( String[] args ) {
    Dog aDog = new Dog("Max");
    // 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, java passes by value
    aDog.getName().equals("Fifi"); // false 
}

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
}

example aDog.getName()中,仍然返回"Max"。由于对象引用被值传递,main中的值aDog不会在函数foo中与Dog "Fifi"更改。如果通过引用传递,则main中的aDog.getName()将在foo调用后返回"Fifi"
同样:

public static void main( String[] args ) {
    Dog aDog = new Dog("Max");
    foo(aDog);
    // when foo(...) returns, the name of the dog has been changed to "Fifi"
    aDog.getName().equals("Fifi"); // 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本身执行(除非d更改为指向不同的Dog实例,如d = new Dog("Boxer")) 。

Code问答: http://codewenda.com/topics/python/
Stackoverflow: Is Java “pass-by-reference” or “pass-by-value”?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

58 − = 48