关于Java引用传递的一个困惑?
ringa_lee
ringa_lee 2017-04-18 10:47:30
[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

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

ringa_lee
ringa_lee

ringa_lee

全部回复(4)
PHPz

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,看看结果。

PHP中文网

swapEqual函数里面,只是改变了形参a、b的引用,并没有改变实参c、d的引用。
而swap里面,改变的c、d对应的区域的值了。
补充一下,Java里面数组也是对象,所以a、b、c、d都是引用。

伊谢尔伦

Java 里的引用和 C++ 里的引用概念有点不一样,Java 里的引用相当于 C++ 中的指针,所以你直接对形参赋值是改变不了实参的。

伊谢尔伦

谢谢大家的回答,都讲的挺好的。我也明白了

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号