在java中对传递给静态函数的参数的更改
class Util{
public static void F(Point p, Point q) {
p.x = 42;
p = q;
}
}
…
Point a = new Point(10,20);
Point b = new Point(30,40);
Util.F(a,b);
System.out.println(a.x + " " + b.x);
如果有人能解释一下为什么输出是42 30
提前感谢
# 1 楼答案
引用由值传递:http://javadude.com/articles/passbyvalue.htm
让我们用一个比喻来解释:
假设一个红色按钮
当我点击红色按钮时,一个球出现了
现在,为了快速获得更多的球,一个新按钮被分配了相同的功能:单击时会出现相同的球
然后,一个人来改变这个新按钮,使另一个球出现
你对第一个按钮有什么期待?让它看起来像原来的还是新的
当然是原版因为,虽然按钮指向同一个球,但它们是完全独立的,这解释了为什么应用于第二个按钮的更改不会改变第一个按钮的目标
只有当第二个按钮突变了第一个球(不改变它!)时,例如,将其涂成蓝色而不是红色,然后是的,第一个按钮将指向同一个蓝色球,因为它是。。同样的
用
a
或b
引用替换原始的按钮,用所创建的Point
的x
值替换球p.x = 42
是第二个球的赋值p
方法参数是第二个按钮(因为通过值/copy传递)别忘了:突变(
p.x = 42
例如)对调用方环境是可见的,但替换的情况不可见(赋值)我希望您现在理解为什么输出是
42 30
而不是30 30
如您所料;)# 2 楼答案
当你做
p = q
时,它不会改变点a的值,只会改变临时变量p的引用,即q。 但是p.x=42引用了p中的一个值,所以这实际上改变了它# 3 楼答案
方法
F
将作为第一个参数传递的对象中的字段x
的值更改为42
,而不更改作为第二个参数传递的对象中字段的任何状态所以,您所做的是:创建对象
a
,不管您在其构造函数中传递了什么值:方法F
将a.x
更改为42
<;-这是输出的第一部分您还创建了对象
b
,其x
状态等于30
。方法F
没有更改其值,因此这是输出的第二部分字符串代码行
p = q
怎么样?它没有任何价值。它只是将变量p
的引用更改为对引用变量q
的对象的引用。它不会改变对象本身的状态# 4 楼答案
p
和q
是参考文献的值拷贝。在F
中,赋值p = q
只会改变p
指向的对象,而不是实际对象本身,或调用方中的任何值p.x = 42
更改字段x
,使其在p
引用的对象中具有值42
总之,
a
的x
字段将由Util.F
更改,但b
不会以任何方式更改