变量在内存中的探究 J2SE 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 参考一下:http://blog.csdn.net/jessieca/article/details/1801746 这个问题其实没那么复杂,无论是对象数组还是基本类型数组都是第一级对象,意思就是都是在堆区开辟了内存空间的,不同的是对象数组在堆中存储的是引用而基本类型在堆中存储的是真正的基本类型的值。而对于基本类型而言,它并不是真正意义上的对象,而仅仅是值,所以其没有在堆区开辟内存,而是在一个特殊的常量区存储。而只要是程序中用到的变量都会在用到它时在栈区建立引用。所以数组情况是这样的栈 堆arr1 -------> arr1arr2--------> arr1其中对arr2的修改相当于修改了arr1,所以arr2[0]会发生变化但是基本类型的赋值就不是这样了栈 共享池a------------------>1b------------------>1当b修改时b------------------>87但是a不会发生变化,因为1不是对象a的引用,而仅仅是个常量区的值而已。 java中只有基本类型和对象两种,基本类型是值传递,对象是引用传递也就是指针传递,数组也是对象,所以是引用传递,而int是基本类型,是值传递。再说一步,为什么会有值传递和引用传递?因为现在的cpu的数据总线一般是64位的,也就是一次性往cpu里送数据最多送64位,而int等基本类型长度小于64位(最长的long和double是64位),可以一次性送完,但是对于对象来说,一个对象可能占十几,几十的字节,甚至好几M,而栈的容量有限,不可能把整个对象塞到栈里,所以只传递指针,根据指针跳转到对应的对象里 这个问题我后来回去看了基本概念,java中只有基本数据类型和对象两种,用的就是这个概念,数组被理解为对象了。 解决这个问题分步骤理解: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指代的存储空间的数据的变化。这就是基本数据类型和引用数据类型的区别。纯手打。希望可以帮到你!!! 上面解释是为了让你更好的理解,实际java对基本数据类型做了点内存优化,就是在b变量初始化值的时候会在当前栈内存中自动搜寻是否存在相同的值的存储空间,如果有了就不再开辟新空间,直接指代到那个值所在的存储空间,也就是一块存储空间可以有多个代名词!很正常的人可能有多个名字嘛!当你给b赋新值的时候,java会做同样的搜寻动作,看看当前栈空间是否有相同的值,没有就会开辟新的存储空间存放新值。这样就可以既节省内存空间,又可以造成a和b值相同时指代不同存储空间的假象!! 完全理解错误.java是数值传递,基本类型值是内容本身,对象类型是指向对象的指针.int[] arr1={1,2,3,4}; int[] arr2=arr1; arr2={5,6,7,8};//arr2指向新的数组,arr1指向的仍然是原来的数组 for(int b:arr1){ System.out.println(b); }结果一定是1 2 3 4 可以看看http://blog.csdn.net/u014496722/article/details/22935371堆栈:位于通用RAM中。某些JAVA数据存储于堆栈中-特别是对象引用,但是JAVA对象并不存储于其中。堆:用于存放所有的JAVA对象。对于基本类型,JAVA往往是不用new来创建变量,而是创建一个并非引用的“自动变量”,这个变量的值存储在堆栈中,因此更加高效。 数组是new出来的,肯定是引用类型啊。 对于基本数据类型,变量存储的是值本身,LZ的例子中,int b=a;表示将a的值拷贝给b.其实语句 int[] arr2=arr1;也是同样的意思,将arr1中的值拷贝给arr2.最好的理解方式,我觉得存储的内容是什么.基本数据类型存储的是值本身,比如 int a = 1;中a存储的就是值 1.所以你拷贝给b后,a本身当然不会变.但是对于引用数据类型,arr1拷贝给arr2后,本身还是不会变的(因为实际上他们存储的是对象的地址).但是为什么打印会变呢,他们引用的是对象(同一个对象),也就是说,他们引用的对象的内容变,所以变.所以我觉得最好的理解方式,就是存储内容,基本数据类型存储的是值本身.引用数据类型存储的是对象的地址.很好理解的. 这个还是很好解释的,数组传的是引用,也就是地址,而基本类型只是单单传的是值,所以你改变arr2的值后arr1也会变,因为他们指向的是同一个地址里的值,而基本类型有个特点是,如果两个同类的变量的值相同,那么他们就是指向同一个值,也就是同一个地址,但是,如果你一改变其中一个基本变量的值,那么它就会指向别的地址,而上一个地址里的值是不会改变的,这就是为什么a的值是1了。 以上全是个人理解,如果有错也望大家能点出,希望能给LZ一点帮助 2,将arr1指代的存储空间的数据复制一份存到arr2指代的存储空间这句话正确吗?只是将arr1的引用给了arr2吧?推荐楼主看一下Tinking in java 基本类型存储了实际数值,不是指向对象的引用。所以b=a 的时候相当于复制了一份给b也就是3楼说的 对的,我说错了,的确是将arr1指代的存储空间的数据复制一份存到arr2指代的存储空间,只不过这个数据不是对象,而是地址值。另外Java参数的传递方式只有一种:值传递。(这个值有时指数值,有时指地址值或者叫引用) java传递结构体数组给oracle存储过程,性能太差了 嵌套的try...catch语句好不好 关于File中delete方法的异常问题~~ 如何在面板上显示超链接? JMenu的显示的顺序与添加顺序有关吗? 能不能在JScrollPane上面放多个文本框? jdbc问题 关于JBOSS的一个问题 请问什么地方有JAVA 的联机文档下啊???? 重新写一个函数,把一个10进制整数的字符串转换成数字 做毕业设计的同学问一下java问题 Java中的数3退1问题提问!
栈 堆
arr1 -------> arr1
arr2--------> arr1
其中对arr2的修改相当于修改了arr1,所以arr2[0]会发生变化但是基本类型的赋值就不是这样了
栈 共享池
a------------------>1
b------------------>1
当b修改时
b------------------>87
但是a不会发生变化,因为1不是对象a的引用,而仅仅是个常量区的值而已。
因为现在的cpu的数据总线一般是64位的,也就是一次性往cpu里送数据最多送64位,而int等基本类型长度小于64位(最长的long和double是64位),可以一次性送完,但是对于对象来说,一个对象可能占十几,几十的字节,甚至好几M,而栈的容量有限,不可能把整个对象塞到栈里,所以只传递指针,根据指针跳转到对应的对象里
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指代的存储空间的数据的变化。这就是基本数据类型和引用数据类型的区别。
纯手打。希望可以帮到你!!!
就是在b变量初始化值的时候会在当前栈内存中自动搜寻是否存在相同的值的存储空间,
如果有了就不再开辟新空间,直接指代到那个值所在的存储空间,也就是一块存储空间可以有多个代名词!很正常的人可能有多个名字嘛!当你给b赋新值的时候,java会做同样的搜寻动作,看看当前栈空间是否有相同的值,没有就会开辟新的存储空间存放新值。这样就可以既节省内存空间,又可以造成a和b值相同时指代不同存储空间的假象!!
java是数值传递,基本类型值是内容本身,对象类型是指向对象的指针.int[] arr1={1,2,3,4};
int[] arr2=arr1;
arr2={5,6,7,8};//arr2指向新的数组,arr1指向的仍然是原来的数组
for(int b:arr1){
System.out.println(b);
}
结果一定是1 2 3 4
堆栈:位于通用RAM中。某些JAVA数据存储于堆栈中-特别是对象引用,但是JAVA对象并不存储于其中。
堆:用于存放所有的JAVA对象。
对于基本类型,JAVA往往是不用new来创建变量,而是创建一个并非引用的“自动变量”,这个变量的值存储在堆栈中,因此更加高效。
其实语句 int[] arr2=arr1;也是同样的意思,将arr1中的值拷贝给arr2.最好的理解方式,我觉得存储的内容是什么.
基本数据类型存储的是值本身,比如 int a = 1;中a存储的就是值 1.所以你拷贝给b后,a本身当然不会变.
但是对于引用数据类型,arr1拷贝给arr2后,本身还是不会变的(因为实际上他们存储的是对象的地址).
但是为什么打印会变呢,他们引用的是对象(同一个对象),也就是说,他们引用的对象的内容变,所以变.
所以我觉得最好的理解方式,就是存储内容,基本数据类型存储的是值本身.引用数据类型存储的是对象的地址.很好理解的.
以上全是个人理解,如果有错也望大家能点出,希望能给LZ一点帮助
只是将arr1的引用给了arr2吧?
推荐楼主看一下Tinking in java