微科社区,轻松开发从此开始! 请登陆 免费注册

微科社区

当前位置:首页 > Java平台 > J2SE >

变量在内存中的探究

时间:2014-04-15 17:06  浏览:努力统计中...
今天看了个基础的例子,数组的引用与内存问题: int[]arr1={1,2,3,4}; int[]arr2=arr1; arr2[0]=10; for(intb:arr1){ System.out.println(b); } 这时我们会发现输出的arr1值已经被改变为10,2,3,4 原因是arr2作为一
今天看了个基础的例子,数组的引用与内存问题:
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。

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


看一下内存的结构,可以大致理解为,栈中存放的是引用,堆中存放的是内容;

感觉跟C语言的指针有点像啊

楼主这就是基本数据类型与引用数据类型的区别。

参考一下:http://blog.csdn.net/jessieca/article/details/1801746

基本数据类型的数据是存放在栈中的,而引用数据是存放在堆中的

看看,支持下。



除了基本数据类型,其他声明出来的都应该称为引用吗?譬如自定义的类,譬如数组,这些声明了之后都只能算是一个引用数据类型吗



栈跟堆这两个概念我感觉理解起来很模糊,有相关的文章推荐看看吗,谢谢

该回复于2014-04-06 17:12:00被版主删除




栈跟堆这两个概念我感觉理解起来很模糊,有相关的文章推荐看看吗,谢谢

如果堆和栈的概念不是很清楚  建议楼主可以参考一下毕向东的视频 ,里面讲的很详细,分析得很透彻,一看就明白

这个问题其实没那么复杂,无论是对象数组还是基本类型数组都是第一级对象,意思就是都是在堆区开辟了内存空间的,不同的是对象数组在堆中存储的是引用而基本类型在堆中存储的是真正的基本类型的值。而对于基本类型而言,它并不是真正意义上的对象,而仅仅是值,所以其没有在堆区开辟内存,而是在一个特殊的常量区存储。而只要是程序中用到的变量都会在用到它时在栈区建立引用。

所以数组情况是这样的
栈                堆
arr1 -------> arr1
arr2--------> arr1
其中对arr2的修改相当于修改了arr1,所以arr2[0]会发生变化

但是基本类型的赋值就不是这样了
栈               共享池
a------------------>1
b------------------>1
当b修改时
b------------------>87
但是a不会发生变化,因为1不是对象a的引用,而仅仅是个常量区的值而已。


上面打错了 不是共享池是常量池。。。。

算了 这个问题我还是再学习好了,貌似对常量池的理解错了,不要对lz进行误导了

java中只有基本类型和对象两种,基本类型是值传递,对象是引用传递也就是指针传递,数组也是对象,所以是引用传递,而int是基本类型,是值传递。

再说一步,为什么会有值传递和引用传递?
因为现在的cpu的数据总线一般是64位的,也就是一次性往cpu里送数据最多送64位,而int等基本类型长度小于64位(最长的long和double是64位),可以一次性送完,但是对于对象来说,一个对象可能占十几,几十的字节,甚至好几M,而栈的容量有限,不可能把整个对象塞到栈里,所以只传递指针,根据指针跳转到对应的对象里

基本数据类型和引用数据类型的区别了,找这方面的书看看



这个问题我后来回去看了基本概念,java中只有基本数据类型和对象两种,用的就是这个概念,数组被理解为对象了。

解决这个问题分步骤理解:
1,理解变量是什么:
解释:变量就是某块固定大小存储空间的代名词,用这个代名词可以访问到这块存储空间,通俗的说就是某栋房子的地址,通过地址可以找到这栋房子。
2,变量为什么有类型的区别:
解释:变量的类型是用来规定变量占用了多大的存储空间,byte是1字节8个比特位,short是占用2字节16个比特位。。。等等。变量的类型用来限制它指代的存储空间的大小。
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线------