0

我一直在阅读很多关于这个的帖子,所有的答案都倾向于反驳之前的答案,而且它们似乎都是由高等级的人提出的,所以我很困惑,只想知道这是否有效:

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 的副本?

在我开始在这里阅读有关它的主题之前,我认为这对我来说很清楚,哈哈

编辑:感谢更正代码,我只是把它写在这里作为例子,没有看到错误

多谢你们。我也对人们说按值传递感到困惑,所以我不确定它是否传递内存中的地址,因为对我来说那是传递一个参考,所以我不清楚。

4

3 回答 3

2

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

于 2013-02-04T05:34:32.243 回答
0

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

基本上你是对的,这就是为什么:

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

唯一的例外是原语——它们不是通过引用传递的,而是通过值传递的,就像您可能在其他语言中学到的那样。

一旦您知道调用方法并将参数传递给它时到底发生了什么,这将不再使您感到困惑:)

希望这可以帮助

于 2013-02-04T05:38:38.783 回答
0

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

看看这篇文章,看看提供的示例中对象和方法参数之间的行为差​​异。

于 2013-02-04T05:39:15.150 回答