java - 交换函数: Java Pass-By-Value code failed

标签 java pass-by-value

 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 的交换失败。

最佳答案

Java始终都是按值传递。这是基元和对象的唯一机制。

关键是要知道为对象传递了什么。它不是物体本身;而是物体本身。存在于堆中。这是通过值传递的对该对象的引用

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

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

关于java - 交换函数: Java Pass-By-Value code failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11102878/

相关文章:

C++ 通过引用调用

java - 设置方法的状态

Java8 Function apply 方法及其实现

c++ - 通过引用传递的问题

java - 当它是一个像更改数组值这样的参数时,如何更改 Integer 值?

c - 调用者看不到函数中的变量更改?

java - Java 是 "pass-by-reference"还是 "pass-by-value"?

java - 在 GUI 中使用不同的布局

java - 在注释中注入(inject) Spring 属性列表

java - 存储在哈希表中