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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刚金波 中级黑马   /  2013-4-19 12:09  /  1586 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刚金波 于 2013-4-20 08:42 编辑

java语言中的引用数据类型的问题。
例:int [] arr=new arr[3]{3,5,7};
       int[] arr2=arr;
       arr[0]=4;
      System.out.println( arr2[0]);
输出结果也是4,老师说的内存地址值和引用值我听得有点疑惑,如果上面是把arr的内存地址值赋给了arr2,那我要是想把数组赋给arr2要怎么做?

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

7 个回复

倒序浏览
基本数据类型:byte short int long float double char boolean
引用数据类型:类、接口、数组
引用变量相当于c语言的指针
引用变量在方法中用时是放在栈内存中,
基本数据类型在类中是放在堆内存中

就知道这么多

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
首先得明白,数组在内存中是存放与对内存中的,那么任何一个引用(栈内存)指向它的话,都是通过地址值来表示的,所以是不能直接将数组值付给一个数组引用。你要让两个引用指向同一个对象的话,只能通过引用间的地址值传递(Stringl类和Integer类与其有区别,他所产生的最终对象是存放在方法区中的,可能会有多个不同的引用指向同一个字符串,可以不通过引用间值来传递:String str1 = "abc";String str2 = "abc";他们引用的地址是同一个),
即这样:int[] a1 = new int[]{1,2,3};int[] a2 = new int[]{1,2,3}; a1!=a2的,他们在堆内存中new了两个地址。
Integer类的数据装箱与拆箱是JDK1.5的新特性,其中对于对象所指值的范围在(-128~127)间,他们的引用地址是相同的:
Integer i1 = 127;Integer i2 = 127;i1==i2. 因为JVM默认的是该范围数字是常用的, 超出范围则返回false。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
上面所写的代码是错误的,改成这样:
int [] arr=new int[] {3,5,7};
        int[] arr2=arr;
        arr[0]=4;
       System.out.println( arr2[0]);
数组的初始化,不能定义维数.

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
首先
  1. int[] arr2 = arr;
复制代码
是把arr的地址给赋给了arr2,也就是说这个时候arr和arr2指向的是同一个对象(数组),所以修改arr中的元素后,打印arr2[0]也发生了改变。如果是想把数组赋给arr2,可以是使用循环的方式:
  1. arr2 = new int[arr.length];
  2. for(int i = 0; i < arr2.length; i++){
  3.      arr2[i] = arr[i];
  4. }
复制代码
这时修改arr元素就不会影响arr2中的元素。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
要是想把arr数组的值给arr2的话,可以分别赋值嘛,  int[] arr2=arr; 这么写确实是把地址值赋过去了,指向的是同一个数组
或者int [] arr=new arr[]{3,5,7};  int [] arr2=new arr[]{3,5,7};  new两个
因为你就new了一次,也就是说就创建了一个数组,如果想操作两个数组的话,new两个。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
yufeng47 发表于 2013-4-19 13:53
首先得明白,数组在内存中是存放与对内存中的,那么任何一个引用(栈内存)指向它的话,都是通过地址值来表示 ...

学习了,谢谢
回复 使用道具 举报
其实这是典型的内存问题。如果你知道java内存分配情况这种问题就不在话下。
简单的说 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配
也就是帖子中的arr和arr2两个引用变量都在栈内存中
而new arr[3]{3,5,7};在堆内存中
堆内存用于存放由new创建的对象和数组
arr2其实和arr一样都是指向new arr[3]{3,5,7};的引用。说白了,arr和arr2指向的是同一个数组。所以arr[2]也是4
希望能帮到你,
建议你看看java内存分配的知识。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马