我一直在阅读很多关于此的帖子,所有帖子都充满了答案,这些答案往往会对抗之前的答案,而且他们似乎都是排名很高的人,所以我非常困惑,只想知道这是否有效:
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
编辑:感谢您更正代码,我只是在这里写出来作为一个例子,没有看到错误
谢谢你们。我也很困惑,人们说通过价值传递,所以我不确定它是否通过内存中的地址或不是因为我通过一个参考,所以它变得我不清楚。
答案 0 :(得分:2)
你是对的。 changeNumber()将更改传递给它的对象的someNumber变量。您正在传递对象本身的引用,而不是副本。
答案 1 :(得分:0)
虽然这段代码不会编译(你不能使用Object,也无法从静态方法非静态数据字段访问),但我有你的问题。
基本上你是对的,这就是原因:
在Java中,当您将参数传递给方法时,它们通过引用传递,但引用本身是按值传递的。 这是出于我认为的优化原因。 所以实际上,另一个引用是指向内存中相同Object的产生。 如果你自己看看这些引用它们是不同的,但它们都指向同一个对象。因此,当您从'changeNumber'方法中更改对象的内部状态时,它会转到引用'obj'引用的对象并更改它。
唯一的例外是原语 - 它们不是通过引用传递的,而是按照您可能在其他语言中学习的值传递它们。
一旦你知道调用方法并将参数传递给它时究竟发生了什么,这将使你不安:)
希望这有帮助
答案 2 :(得分:0)
你是对的,java通过引用操作对象,并且所有对象变量都是引用,并且不通过引用而是通过值传递方法参数。
查看this article并查看提供的示例中对象和方法参数之间的行为差异。