我知道,在Java中,参数传递是由原始类型的值和引用类型(对象)引用的。为什么在下面的例子中,我认为是一个引用传递参数,在方法交换后对象点没有被修改?
public class Swap2 {
public static void swap(Point p1, Point p2) {
Point temp = p1;
p1 = p2;
p2 = temp;
System.out.println("p1.x " + p1.x);
System.out.println("p2.x " + p2.x);
}
/**
* @param args
*/
public static void main(String[] args) {
Point p1 = new Point(100,200);
Point p2 = new Point(300,400);
//System.out.println("p1=" + p1.toString());
System.out.println("p1=" + p1);
System.out.println("p2=" + p2);
swap( p1, p2 );
System.out.println("p1.x " + p1.x);
System.out.println("p1=" + p1);
System.out.println("p2=" + p2);
}
}
答案 0 :(得分:4)
Java始终通过值 ,无论是原语还是引用传递都无关紧要。
您正在将对象引用的虚拟内存地址副本传递给该方法。在该方法中,您只需将复制的引用重新分配给另一个对象。
您的代码证明了java传递值:)
答案 1 :(得分:4)
java中的参数总是按值传递,但对于对象,传递的值是对象的引用(指针)。
因此,您的赋值在函数范围之外没有任何影响,因为您只是交换了两个局部变量的内容(值)。
答案 2 :(得分:0)
错误 - Java始终按原语和引用类型的值传递。你的误解是你问题的根源。
对象类型的值传递的是引用,因此您无法对其进行修改。您可以修改引用所指向的对象的状态,但前提是它是可变的。
对象未通过;它活在堆里。
答案 3 :(得分:0)
正如已经指出的那些 - 引用是值,您只需更改引用。您要做的是更改内部对象。然后交换方法就可以了。
即
p1.x = p2.x;
p1.y = p2.y;
等等。
答案 4 :(得分:0)
我在这里做了一个类比,如果它有帮助: blog.aaronshaw.net/2014/02/13/java-is-always-pass-by-value/