日期:2014-05-20  浏览次数:20701 次

想当然的问题
public class ObjectParam {
    public void change(int[] b) {
     int tem = b[0];
     b[0] = b[1];
     b[1] = tem;
    }
    public void change(int x, int y) {
     int tem = x;
     x = y;
     y = tem;
    }
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = new int[2];
a[0] = 5;
a[1] = 8;
ObjectParam op = new ObjectParam();
op.change(a);
System.out.println(a[0]);
System.out.println(a[1]);

int aa = 1;
int bb = 2;
op.change(aa, bb);
System.out.println(aa);
System.out.println(bb);

}

}
结果为什么不是8,5,2,1或者5,8,1,2呢,我是把什么地方弄混了?
------解决方案--------------------
没弄错:结果应该是 8 5 1 2
第一个op.change(a);传递的是数组a,引用传递,直接交换数组中元素的值。数组本身引用未变。
第二个op.change(aa, bb);传递的是参数值。
以上只是我的理解,不知道是否有偏差。
建议楼主多理解一下java中的堆和栈,以及值传递和引用传递。上述问题牵涉到值传递、引用传递、堆、栈等的理解。
------解决方案--------------------
结果是8 5 1 2 就没有错。
首先我想纠正 1 楼的是,java中,传递的都是值传递,因为在引用和地址的说法,在java中,如果是引用,传递的是引用地址的值。
LZ初学的吧,你可以画他们的简单的内存图就明白了。
在java中的所有类及其数组,都是引用(即对象的地址值)。
main中的引用“op”开始指向数组对象,当调用change将数组传递时,使得栈中的引用也指向该数组(同一个对象)“这里是关键”。
而如果是基本数据类型的话,传递的是值本身,也就是说,接受的是另一个东西(只是他们的字面量值相等)。方法接受对值的改变不会影响原来的值。而你在main中打印的是 原来的值,所有自然就是原来的值。,说的应该很清楚了哦。。。
------解决方案--------------------
8 5 1 2 这个答案没有错误

在java数据的值传递的过程中,只有传值这一说,没有传引用的概念。
public void change(int[] b) {
     int tem = b[0];
     b[0] = b[1];
     b[1] = tem;
    }
这个进行的是传地址,先把b[0] 中的元素放在temp中存储,把b[0] = b[1]就是把b[1]的元素放在b[0]的存储单元,再把temp中存储的数据,放到b[1]存储单元。这样就实现了数值的交换,可是存储地址并没有改变。所以输出的结果是8,5
   public void change(int x, int y) {
     int tem = x;
     x = y;
     y = tem;
    }
这个方法是进行原型数据类型的交换,在这个方法中确实实现了数据的交换,
可是把执行完的交换数据送到主方法中时,这个方法中使用的变量x,y独立于主方法中aa,bb。
因此交换后的x,y的数值对aa,bb没有任何的影响。所以输出1,2没有交换。

------解决方案--------------------

这样改一下代码,就能输出a,b的交换了,你就看的更明白:
public class ObjectParam 
{
    public void change(int[] b) //实现互换
    {
     int tem = b[0];
     b[0] = b[1];
     b[1] = tem;
    }
    public void change(int x, int y) 
    {
     int tem = x;
     x = y;
     y = tem;
    // return (x);