Java中向方法传递对象参数

1.在两个swap函数中,swap1对实例进行交换操作,而swap2对实例数据域进行交换操作,令我感到疑惑的是为什么swap1交换后输出的数据域没有发生交换?

代码如下:

public class ObjectAndClass {
    public static void main(String[] args) {
        Circle circle1 = new Circle(1);
        Circle circle2 = new Circle(2);
        System.out.println("circle1 = " +
                circle1.radius + " circle2 = " + circle2.radius);
        swap1(circle1, circle2);
        System.out.println("After swap1: circle1 = " +
                circle1.radius + " circle2 = " + circle2.radius);

        swap2(circle1, circle2);
        System.out.println("After swap2: circle1 = " +
                circle1.radius + " circle2 = " + circle2.radius);

    }

    public static void swap1(Circle x, Circle y){
        Circle temp = x;
        x = y;
        y =temp;
    }
    public static void swap2(Circle x, Circle y){
        double temp = x.radius;
        x.radius = y.radius;
        y.radius = temp;
    }
}

class Circle{
    double radius;

    Circle(double newRadius){
        radius = newRadius;
    }
}

swap1只是改变了一个内存的指向,实际内存并没有变。

首先,java中只有值的传递,也就是说对于基本类型传递的就是基本类型本身,而对象传递的则是对于该对象的引用。你在swap1方法调用中进行的交换,交换的是形参,而原始实际参数的指针依然是原来的引用。而你在你在swap2方法调用中进行的交换,操作的是对象的属性,直接设置两个对象的属性值交换,那么原来的对象的属性也就跟着变了,因为引用的是同一个地址。

https://baijiahao.baidu.com/s?id=1621200418047815846&wfr=spider&for=pc

public class ObjectAndClass {
    public static void main(String[] args) {
        Circle circle1 = new Circle(1);
        Circle circle2 = new Circle(2);
        System.out.println("circle1 = " +
                circle1.radius + " circle2 = " + circle2.radius);
        swap1(circle1, circle2);
        System.out.println("After swap1: circle1 = " +
                circle1.radius + " circle2 = " + circle2.radius);
    }

    public static void swap1(Circle x, Circle y){
        double temp = x.radius;
        x.radius = y.radius;
        y.radius = temp;
    }
}

class Circle{
    public double radius;

    public Circle(double newRadius){
        radius = newRadius;
    }
}

得这样写

swap 方法只是修改了形式入参的指针的指向,对原来调用者的变量的指针并没有影响。
对象传递,只有修改对象内容才对原来调用者的对象变量有影响。