日期:2014-05-20  浏览次数:20784 次

变量在内存中的探究
今天看了个基础的例子,数组的引用与内存问题:
int[] arr1={1,2,3,4};
int[] arr2=arr1;
arr2[0]=10;
for(int b:arr1){
System.out.println(b);
}
这时我们会发现输出的arr1值已经被改变为10,2,3,4

原因是arr2作为一个引用,指向的是arr1已经在内存中创建的值,当我们改变arr2的值时,arr1这个引用指向的内存同时被改变。

这是我的理解不知道解释得是否完全正确,然后问题就来了,我们用int声明一个变量的时候不能同时用这个理论吗:
int a=1;
int b=a;
b=87;
System.out.println(a);

这时候的a仍然是内存中的1。

怎么解释这两种情况的不同?

------解决方案--------------------
楼主这就是基本数据类型与引用数据类型的区别。
------解决方案--------------------
参考一下:http://blog.csdn.net/jessieca/article/details/1801746
------解决方案--------------------
解决这个问题分步骤理解:
1,理解变量是什么:
解释:变量就是某块固定大小存储空间的代名词,用这个代名词可以访问到这块存储空间,通俗的说就是某栋房子的地址,通过地址可以找到这栋房子。
2,变量为什么有类型的区别:
解释:变量的类型是用来规定变量占用了多大的存储空间,byte是1字节8个比特位,short是占用2字节16个比特位。。。等等。变量的类型用来限制它指代的存储空间的大小。
3,变量的作用:
解释:在内存中占据一块指定大小的内存,这块内存用来存放指定类型的数据。
int[] arr1={1,2,3,4};
这句话的意思是:
1,在栈内存开辟一块int数组类型的引用类型的存储空间,该空间的代名词是arr1。
2,{1,2,3,4}在堆内存中会开辟一块存储空间,将那4个int类型的数存放进去。
3,将该堆内存中开辟存储空间的首地址的地址值存放到栈内存arr1指代的存储空间中。这时arr1这块存储空间存放的数据是一个地址值,这块存储空间的类型叫引用类型。

int[] arr2=arr1;
1,在栈内存开辟一块int数组类型的引用类型的存储空间,该空间的代名词是arr2。
2,将arr1指代的存储空间的数据复制一份存到arr2指代的存储空间

这时候arr1和arr2指代的存储空间存放的地址值是一样的,所以通过这个地址值都访问到的相同堆内存开辟的那块存储空间并且修改那块存储空间的数据。所以通过arr2去访问修该堆内存的数据时,再通过arr1去访问时就是已经修改后的值了。

int a=1;
这句话的意思是:
1,在栈内存开辟一块32个比特位4字节的存储空间。这块空间的代名词是a,
2,将整数1转化为32位的二进制数据存放在这块存储空间。

int b=a;
1,在栈内存开辟一块32个比特位4字节的存储空间。这块空间的代名词是b,
2,将a指代的存储空间中的数据复制一份存放到b指代的存储空间中。

b=87;
将b指代的存储空间的数据变成87的32位二进制数据。

这时候a和b指代的是栈内存中的不同存储空间,所以b指代的存储空间数据变化不会影响到a指代的存储空间的数据的变化。

这就是基本数据类型和引用数据类型的区别。
纯手打。希望可以帮到你!!!
------解决方案--------------------
基本数据类型和引用数据类型不同啊
------解决方案--------------------
数组的是引用类型,变量那个只是简单地赋值操作!
------解决方案--------------------


引用:
解决这个问题分步骤理解:
1,理解变量是什么:
解释:变量就是某块固定大小存储空间的代名词,用这个代名词可以访问到这块存储空间,通俗的说就是某栋房子的地址,通过地址可以找到这栋房子。
2,变量为什么有类型的区别:
解释:变量的类型是用来规定变量占用了多大的存储空间,byte是1字节8个比特位,short是占用2字节16个比特位。。。等等。变量的类型用来限制它指代的存储空间的大小。
3,变量的作用:
解释:在内存中占据一块指定大小的内存,这块内存用来存放指定类型的数据。
int[] arr1={1,2,3,4};
这句话的意思是:
1,在栈内存开辟一块int数组类型的引用类型的存储空间,该空间的代名词是arr1。
2,{1,2,3,4}在堆内存中会开辟一块存储空间,将那4个int类型的数存放进去。
3,将该堆内存中开辟存储空间的首地址的地址值存放到栈内存arr1指代的存储空间中。这时arr1这块存储空间存放的数据是一个地址值,这块存储空间的类型叫引用类型。

int[] arr2=arr1;
1,在栈内存开辟一块int数组类型的引用类型的存储空间,该空间的代名词是arr2。
2,将arr1指代的存储空间的数据复制一份存到arr2指代的存储空间

这时候arr1和arr2指代的存储空间存放的地址值是一样的,所以通过这个地址值都访问到的相同堆内存开辟的那块存储空间并且修改那块存储空间的数据。所以通过arr2去访问修该堆内存的数据时,再通过arr1去访问时就是已经修改后的值了。

int a=1;
这句话的意思是:
1,在栈内存开辟一块32个比特位4字节的存储空间。这块空间的代名词是a,
2,将整数1转化为32位的二进制数据存放在这块存储空间。

int b=a;
1,在栈内存开辟一块32个比特位4字节的存储空间。这块空间的代名词是b,
2,将a指代的存储空间中的数据复制一份存放到b指代的存储空间中。

b=87;
将b指代的存储空间的数据变成87的32位二进制数据。

这时候a和b指代的是栈内存中的不同存储空间,所以b指代的存储空间数据变化不会影响到a指代的存储空间的数据的变化。

这就是基本数据类型和引用数据类型的区别。
纯手打。希望可以帮到你!!!

2,将arr1指代的存储空间的数据复制一份存到arr2指代的存储空间这句话正确吗?
只是将arr1的引用给了arr2吧?
推荐楼主看一下Tinking in java