2 luke003 luke003 于 2016.01.30 21:03 提问

java 方法传值问题:请大家帮忙看看指点指点:代码如下:

package com.imooc;

public class Test{
public static void main(String[] args) {

Circle c1 = new Circle(1);
Circle c2 = new Circle(2);
 swap1(c1,c2);

 System.out.println("After swap1:"+c1.radius+c2.radius);

 swap2(c1,c2);
 System.out.println("After swap2:"+c1.radius+c2.radius);


}

public static void swap1(Circle x,Circle y){
    Circle t = x;
    x = y;
    y = t;
}


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

}

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

不是说传递基本数据类型的参数时:方法内的参数变化不影响方法外的参数。而传递引用数据类型的参数时,是传递共享,参数会发生变化吗?为什么这里的swap1没发生变化而swap2却发生对调了?

3个回答

caozhy
caozhy   Ds   Rxr 2016.01.31 06:37
 传递引用改变的是对象本身,而不是让引用指向两一个对象。
看下面的代码:
class A
{
    public int x;
        public int y;
}
正确写法如下
void swap(A a)
{
int t = a.x;
a.x = y; //改变对象的字段
a.y=t;
}
错误写法
void swap(A a)
{
    int x = a.x;
        int y = a.y;
        a = new A(); //让a指向另一个对象
        a.x = y;
        a.y = x;
}
zrf1335348191
zrf1335348191   2016.01.31 14:56

同意楼上,方法执行过程是,先对对象进行拷贝,方法结束后,拷贝的对象将不再使用,对象还是那个对象

july_apple
july_apple   2016.01.30 21:28

java中只有值传递。swap1方法中,你试图去交换两个引用变量,引用类型变量的值传递,传递的是存储单元中的内容,而非地址或者引用。所以swap1没有发生变化。而swap2方法是值传递,它传递的是存储单元的内容。内容可以改变,引用不可以改变。所以你会看到不一样的运行效果。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!