返回信息流大家看我这么理解对不对,问题主要是基本数据类型的存储问题
Person[] per=new Person[8];
per[0]=new Person();
new Person[8]同样是在堆中声明一个大小为8的连续内存,per[0]=new Person(); 新建的对象是在堆中的,per[0]指向堆中的一块内存
而对于
int[] aa=new int[8];
aa[0]=1;
我本人理解是new int[8]会在堆内存中声明一块大小为8的连续内存,aa[0]=1,这个整形数字1,应该是在方法区运行常量池中的,aa[0]相当于一个指针指向常量池中的数字1;
-**************************************-
现贴一个个人觉得不错的答案,再次感谢暖神:
java的基本数据类型共有8种,即int,short,long,byte,float,double,boolean,char(注意,并没有String的基本类型 )。这种类型的定义是通过诸如int a = 3;long b = 255L;的形式来定义的。如int a = 3;这里的a是一个指向int类型的引用,指向3这个字面值。这些字面值的数据,由于大小可知,生存期可知(这些字面值定义在某个程序块里面,程序块退出后,字段值就消失了),出于追求速度的原因,就存在于栈中。
另外,栈有一个很重要的特殊性,就是存在栈中的数据可以共享。比如:
我们同时定义:
int a=3;
int b=3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b这个引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。
定义完a与b的值后,再令a = 4;那么,b不会等于4,还是等于3。在编译器内部,遇到时,它就会重新搜索栈中是否有4的字面值,如果没有,重新开辟地址存放4的值;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。
这是一条镜像帖。来源:北邮人论坛 / java / #49198同步于 2016/4/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
运行常量池访问题(基本数据类型+引用类型)
hayabusa
2016/4/11镜像同步14 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 zhaoyu1999 的大作中提到: 】
: 我觉得这种问题没意义啊 你完全可以自己实现一个虚拟机 把数据到处乱放
: 堆啊 栈啊 爱放那放哪 规范上又没写死说哪里是堆 哪里是栈
大哥,我自己能实现虚拟机我来问这个?
【 在 hayabusa 的大作中提到: 】
: 我想问的是基本数据类型在内存中是存放什么位置的
Java Language Specification和Java VM Specification都没有规定数据在内存中如何储存。所以,可以存在寄存器里,可以存在栈上,可以存在堆里,可以存在数组里,可以不存在数组里,可以单独创建一个堆里的对象来存储这个基本的类型比如int,都可以。虚拟机可以把所有的int当Integer来实现,给每个int分配一个堆里的对象,都可以。只要行为满足JVMS的要求就可以了。