黑马程序员技术交流社区
标题:
java引用数据类型的问题
[打印本页]
作者:
刚金波
时间:
2013-4-19 12:09
标题:
java引用数据类型的问题
本帖最后由 刚金波 于 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要怎么做?
作者:
乘鱼飞
时间:
2013-4-19 12:58
基本数据类型:byte short int long float double char boolean
引用数据类型:类、接口、数组
引用变量相当于c语言的指针
引用变量在方法中用时是放在栈内存中,
基本数据类型在类中是放在堆内存中
就知道这么多
作者:
yufeng47
时间:
2013-4-19 13:53
首先得明白,数组在内存中是存放与对内存中的,那么任何一个引用(栈内存)指向它的话,都是通过地址值来表示的,所以是不能直接将数组值付给一个数组引用。你要让两个引用指向同一个对象的话,只能通过引用间的地址值传递(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。
作者:
杨同旺
时间:
2013-4-19 17:01
上面所写的代码是错误的,改成这样:
int [] arr=new int[] {3,5,7};
int[] arr2=arr;
arr[0]=4;
System.out.println( arr2[0]);
数组的初始化,不能定义维数.
作者:
娄田田
时间:
2013-4-19 17:51
首先
int[] arr2 = arr;
复制代码
是把arr的地址给赋给了arr2,也就是说这个时候arr和arr2指向的是同一个对象(数组),所以修改arr中的元素后,打印arr2[0]也发生了改变。如果是想把数组赋给arr2,可以是使用循环的方式:
arr2 = new int[arr.length];
for(int i = 0; i < arr2.length; i++){
arr2[i] = arr[i];
}
复制代码
这时修改arr元素就不会影响arr2中的元素。
作者:
up.yfei
时间:
2013-4-19 17:51
要是想把arr数组的值给arr2的话,可以分别赋值嘛, int[] arr2=arr; 这么写确实是把地址值赋过去了,指向的是同一个数组
或者int [] arr=new arr[]{3,5,7}; int [] arr2=new arr[]{3,5,7}; new两个
因为你就new了一次,也就是说就创建了一个数组,如果想操作两个数组的话,new两个。
作者:
刚金波
时间:
2013-4-19 18:34
yufeng47 发表于 2013-4-19 13:53
首先得明白,数组在内存中是存放与对内存中的,那么任何一个引用(栈内存)指向它的话,都是通过地址值来表示 ...
学习了,谢谢
作者:
gerenvip
时间:
2013-4-19 21:57
其实这是典型的内存问题。如果你知道java内存分配情况这种问题就不在话下。
简单的说 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配
也就是帖子中的arr和arr2两个引用变量都在栈内存中
而new arr[3]{3,5,7};在堆内存中
堆内存用于存放由new创建的对象和数组
arr2其实和arr一样都是指向new arr[3]{3,5,7};的引用。说白了,arr和arr2指向的是同一个数组。所以arr[2]也是4
希望能帮到你,
建议你看看java内存分配的知识。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2