有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在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

提前感谢


共 (4) 个答案

  1. # 1 楼答案

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

    让我们用一个比喻来解释:

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

    你对第一个按钮有什么期待?让它看起来像原来的还是新的
    当然是原版因为,虽然按钮指向同一个球,但它们是完全独立的,这解释了为什么应用于第二个按钮的更改不会改变第一个按钮的目标
    只有当第二个按钮突变了第一个球(不改变它!)时,例如,将其涂成蓝色而不是红色,然后是的,第一个按钮将指向同一个蓝色球,因为它是。。同样的

    ab引用替换原始的按钮,用所创建的Pointx值替换
    p.x = 42第二个球的赋值
    p方法参数是第二个按钮(因为通过值/copy传递)

    别忘了:突变p.x = 42例如)对调用方环境是可见的,但替换的情况不可见(赋值)

    我希望您现在理解为什么输出是42 30而不是30 30如您所料;)

  2. # 2 楼答案

    当你做p = q时,它不会改变点a的值,只会改变临时变量p的引用,即q。 但是p.x=42引用了p中的一个值,所以这实际上改变了它

  3. # 3 楼答案

    方法F将作为第一个参数传递的对象中的字段x的值更改为42,而不更改作为第二个参数传递的对象中字段的任何状态

    所以,您所做的是:创建对象a,不管您在其构造函数中传递了什么值:方法Fa.x更改为42<;-这是输出的第一部分

    您还创建了对象b,其x状态等于30。方法F没有更改其值,因此这是输出的第二部分

    字符串代码行p = q怎么样?它没有任何价值。它只是将变量p的引用更改为对引用变量q的对象的引用。它不会改变对象本身的状态

  4. # 4 楼答案

    pq是参考文献的值拷贝。在F中,赋值p = q只会改变p指向的对象,而不是实际对象本身,或调用方中的任何值

    p.x = 42更改字段x,使其在p引用的对象中具有值42

    总之,ax字段将由Util.F更改,但b不会以任何方式更改