传递java的参数

时间:2014-02-18 12:23:43

标签: java

我知道,在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);    
    }    
}

5 个答案:

答案 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/