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呢,我是把什么地方弄混了?

解决方案 »

  1.   

    没弄错:结果应该是 8 5 1 2
    第一个op.change(a);传递的是数组a,引用传递,直接交换数组中元素的值。数组本身引用未变。
    第二个op.change(aa, bb);传递的是参数值。
    以上只是我的理解,不知道是否有偏差。
    建议楼主多理解一下java中的堆和栈,以及值传递和引用传递。上述问题牵涉到值传递、引用传递、堆、栈等的理解。
      

  2.   

    结果是8 5 1 2 就没有错。
    首先我想纠正 1 楼的是,java中,传递的都是值传递,因为在引用和地址的说法,在java中,如果是引用,传递的是引用地址的值。
    LZ初学的吧,你可以画他们的简单的内存图就明白了。
    在java中的所有类及其数组,都是引用(即对象的地址值)。
    main中的引用“op”开始指向数组对象,当调用change将数组传递时,使得栈中的引用也指向该数组(同一个对象)“这里是关键”。
    而如果是基本数据类型的话,传递的是值本身,也就是说,接受的是另一个东西(只是他们的字面量值相等)。方法接受对值的改变不会影响原来的值。而你在main中打印的是 原来的值,所有自然就是原来的值。,说的应该很清楚了哦
      

  3.   

    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没有交换。
      

  4.   


    这样改一下代码,就能输出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);
        System.out.println(x); //直接输出
        System.out.println(y);
        System.out.println("----------------------");
        }
    /**
     * @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);}}