A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 三生石 中级黑马   /  2014-3-8 14:56  /  1038 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 三生石 于 2014-3-8 16:29 编辑

代码:
public class ArrayTest
{
        public static void main(String[] args)
        {
                int[] arr1=new int[]{1,2,3};
                int[] arr2=new int[]{100,200,300};
                arr1=arr2;
                arr1[0]=5;
                for(int i=0;i<arr2.length;i++)
                        System.out.println("arr2["+i+"]="+arr2);
        }
}

运行后:


为什么?不应该是100,200,300吗?

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

4 个回复

倒序浏览
arr1=arr2;  // 这里已经把 arr2的地址值赋值给了arr1 ,也就是说 arr1也指向了arr2的数组.
回复 使用道具 举报
arr1=arr2; 这句执行的是把arr2的内存地址赋给arr1,这样arr1操作的就是arr2里面的值了,  arr1[0]=5 修改的自然就是arr2的值了。
回复 使用道具 举报
1、int[] arr1=new int[]{1,2,3}; int[] arr2=new int[]{100,200,300};栈内存中产生两个引用型变量arr1,arr2分别指向(所谓的指向就是把数组的首地址值赋予了该变量,通过寻址就可以找到该数组)了堆内存中的两个数组int[]{1,2,3}, int[]{100,200,300}。
2、arr1=arr2;把arr2保存的地址值赋予了arr1,即arr1也指向了数组 int[]{100,200,300}。而数组int[]{1,2,3}会被垃圾回收机制回收的。
3、arr1[0]=5,把arr1指向的数组零角标对应的值置为5,由于arr2也是指向该数组的,所以输出的是5,200,300.要明确引用型变量和数组(或)对象之间的关系。
回复 使用道具 举报
首先"arr2["+i+"]="+arr2这句没看懂
不应该是"arr2["+i+"]="+arr2[i]吗?
注意你的这句:arr1=arr2;
也就是把数组引用类型变量arr2的值赋值给arr1
我们都知道其实存在数组引用类型变量里面的是内存的地址
把arr2的值赋值给arr1也就是把arr2所指向的地址值赋给了arr1
所以arr1[0]指向的内存地址和arr2[0]也就一样了,这时候你改变了arr1[0],也就等于改变了arr2[0]
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马