gpt4 book ai didi

java - java 中传递给静态函数的参数的更改

转载 作者:行者123 更新时间:2023-11-30 04:03:05 25 4
gpt4 key购买 nike

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

提前致谢!

最佳答案

引用通过值传递:http://javadude.com/articles/passbyvalue.htm

用一个比喻来解释一下:

假设有一个红色按钮。
当我点击红色按钮时,会出现一个球。
现在,为了更快地获得更多球,一个新按钮被分配了相同的功能:单击时会出现相同的球。
然后,一个人来改变这个新按钮,使另一个球出现!

您对第一个按钮有何期望?让原来的还是新的出现?
当然是原始的!因为,虽然按钮指向同一个球,但它们是完全独立的,这解释了为什么应用在第二个按钮上的更改不会改变第一个按钮的目标。
仅当第二个按钮突变第一个球(不改变它!),例如将其涂成蓝色而不是红色,那么是的,第一个按钮将指向同一个球蓝色,因为它是。 .一样!

用您的ab引用替换原来的按钮由创建的Pointx值决定。
p.x = 42第二个球的分配。
p 方法参数是第二个按钮(因为通过值/副本传递)。

不要忘记:MUTATIONS(例如p.x = 42)对于调用者环境是可见的,但REPLACMENTS的情况则不然(作业)

我希望您现在明白为什么输出是 42 30 而不是您肯定期望的 30 30 ;)

关于java - java 中传递给静态函数的参数的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21481571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com