java:传递一个对象

时间:2013-02-04 05:29:04

标签: java pass-by-reference

我一直在阅读很多关于此的帖子,所有帖子都充满了答案,这些答案往往会对抗之前的答案,而且他们似乎都是排名很高的人,所以我非常困惑,只想知道这是否有效:

public class Object{    

    private int someNumber = 5; 
    public void setSomeNumber(int newNumber){someNumber = newNumber;}   
}

public class Main {

    Object myObject = new Object();

public static void main(String[] args){ 

    changeNumber(myObject);     
}

void changeNumber(Object obj)
{
    obj.setSomeNumber(10);
}   
}

这会将myObject.someNumber更改为10吗?

我的理解是obj指向内存中与myObject相同的位置,因此调用其使用obj的方法与使用myObject调用它相同,因为obj不仅仅是myObject的副本?

我觉得很清楚,直到我开始在这里阅读关于它的线索lol

编辑:感谢您更正代码,我只是在这里写出来作为一个例子,没有看到错误

谢谢你们。我也很困惑,人们说通过价值传递,所以我不确定它是否通过内存中的地址或不是因为我通过一个参考,所以它变得我不清楚。

3 个答案:

答案 0 :(得分:2)

你是对的。 changeNumber()将更改传递给它的对象的someNumber变量。您正在传递对象本身的引用,而不是副本。

答案 1 :(得分:0)

虽然这段代码不会编译(你不能使用Object,也无法从静态方法非静态数据字段访问),但我有你的问题。

基本上你是对的,这就是原因:

在Java中,当您将参数传递给方法时,它们通过引用传递,但引用本身是按值传递的。 这是出于我认为的优化原因。 所以实际上,另一个引用是指向内存中相同Object的产生。 如果你自己看看这些引用它们是不同的,但它们都指向同一个对象。因此,当您从'changeNumber'方法中更改对象的内部状态时,它会转到引用'obj'引用的对象并更改它。

唯一的例外是原语 - 它们不是通过引用传递的,而是按照您可能在其他语言中学习的值传递它们。

一旦你知道调用方法并将参数传递给它时究竟发生了什么,这将使你不安:)

希望这有帮助

答案 2 :(得分:0)

你是对的,java通过引用操作对象,并且所有对象变量都是引用,并且不通过引用而是通过值传递方法参数。

查看this article并查看提供的示例中对象和方法参数之间的行为差​​异。