【问题标题】:Swapping function : Java Pass-By-Value code failed交换功能:Java Pass-By-Value 代码失败
【发布时间】:2012-06-21 14:31:26
【问题描述】:
 public void swap(Point var1, Point var2)
 {
  var1.x = 100;
  var1.y = 100;
  Point temp = var1;
  var1 = var2;
  var2 = temp;
 }

public static void main(String [] args)
{
  Point p1 = new Point(0,0);
  Point p2 = new Point(0,0);
  System.out.println("A: " + p1.x + " B: " +p1.y); 
  System.out.println("A: " + p2.x + " B: " +p2.y);
  System.out.println(" ");
  swap(p1,p2);
  System.out.println("A: " + p1.x + " B:" + p1.y); 
  System.out.println("A: " + p2.x + " B: " +p2.y);  
}

运行代码产生:

A: 0 B: 0
A: 0 B: 0
A: 100 B: 100
A: 0 B: 0

我了解函数如何更改 p1 的值,因为它是按值传递的。 我不明白为什么 p1 和 p2 的交换失败了。

【问题讨论】:

  • 用方框和箭头画一幅画。 p1p2var1var2 是四个不同的变量框。但是只有两个对象框。当你用图片追踪代码的演变并且你做对了,你可能会比阅读场景的文字描述得到更多启发。

标签: java pass-by-value


【解决方案1】:

在形式参数的地方会生成一个引用的副本,所以会有一个指向Point实例的新引用

【讨论】:

    【解决方案2】:

    myFunction() 只是交换对函数内部两个对象的引用(与外部对象不同),但交换函数外部的引用或对象实例本身!

    【讨论】:

      【解决方案3】:

      对象是通过引用分配的,而不是克隆的,但是参数仍然作为对实际对象的引用,它们不会变成“对引用的引用”。

      我的意思是 var1 最初引用与 p1 相同的对象,但随后您将 var1 更改为引用另一个对象。这不会影响p1 引用的对象,因为var1 不是对p1 的引用,只是对与p1 相同的对象的引用正在引用。

      【讨论】:

        【解决方案4】:

        Java 总是按值传递。这是 原语和对象的唯一机制。

        关键是要知道为对象传递了什么。这不是对象本身;存在于堆上。它是按值传递的对象的引用

        您不能修改传递的引用并将新值返回给调用者,但您可以修改它所引用的对象的状态 - 如果它是可变的并公开适当的方法供您调用。

        类与指针交换,类似于 C 中的可能,不起作用,因为您无法更改传递的引用所指的内容并将新值返回给调用者。

        【讨论】:

        • +1 请参阅此讨论以获得更多有见地的答案stackoverflow.com/questions/40480/is-java-pass-by-reference
        • "您不能修改引用本身" 您可以修改引用以指向不同的对象。这就是交换函数内部发生的事情。但这并没有修改原始函数中的引用,因为 Java 是按值传递的
        • 不,您不能将其返回给调用者。也许我的措辞不清楚;我会修改的。
        猜你喜欢
        • 2016-09-04
        • 2021-02-26
        • 1970-01-01
        • 2017-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多