关于Java引用传递的一个困惑?

查看:135
本文介绍了关于Java引用传递的一个困惑?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

    public static void swapEqual(int[] a,int[] b){
        int[] temp=new int[b.length];
        temp=b;
        b=a;
        a=temp;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] c={1,2};
        int[] d={3,4};
        swapEqual(c,d);
        System.out.println(c[1]);
    }


为什么打印出来的C[1]还是原来的2啊,为什么没有交换。数组的=不就是复制引用吗?通过函数可以把a,b的引用交换,这样不就是把内容交换了吗?
干嘛非要这样写?

public static void swap(int[] a,int[] b){
    int[] temp=new int[b.length];
    for(int i=0;i<b.length;i++){
        temp[i]=b[i];
    }
    for(int i=0;i<b.length;i++){
        b[i]=a[i];
    }
    for(int i=0;i<b.length;i++){
        a[i]=temp[i];
    }
}

这样子我试了一下,就可以达到交换的目的了
好困惑啊,求解!!

解决方案

swapEqual(int[] a,int[] b)中:
一开始:
a --> {1,2}(地址1)
b --> {3,4}(地址2)
经过你的代码处理(a,b指向的地址交换了):
b --> {1,2}(地址1)
a --> {3,4}(地址2)
但是不会对c,d造成影响,c,d依旧是:
c --> {1,2}(地址1)
d --> {3,4}(地址2)

//=================================

swap(int[] a,int[] b)中:
一开始:
a --> {1,2}(地址1)
b --> {3,4}(地址2)
经过你的代码处理(地址1,2中的值交换了):
a --> {3,4}(地址1)
b --> {1,2}(地址2)
虽然不会对c,d指向的地址造成影响,但是原本地址下的值已经改变了:
c --> {3,4}(地址1)
d --> {1,2}(地址2)

//=======================================

我的理解是这样,写完发现与@lianera的表述是同一个意思,就当是补充说明了。

//=======================================

你可以尝试用return把swapEqual(int[] a,int[] b)中交换后的a,b的值赋给c,d,看看结果。

这篇关于关于Java引用传递的一个困惑?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆