关于栈内存与基本数据类型

ImAmelie 2017-08-01 12:24:35
java中数据的5种存储位置(堆与栈)
http://blog.csdn.net/ghost_programmer/article/details/40891735
看了这篇文章之后我有几个疑问

如果我在一个main()方法里这么写

public static void main(String[] args) {
int a = 5;
int b = 5;
int c = 5;
}

请问在栈中是如何分配的
我猜到了3种可能:
1.把5放到常量池中,之后a,b,c作为指针(存地址),指向常量池中的5
2.把5放到常量池中,之后a,b,c作为int型,里面存的还是5
3.不把5放到常量池中.a,b,c作为int型,里面存的都是5

请问哪种对呀?
...全文
260 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bonsour 2017-08-01
  • 打赏
  • 举报
回复
对于初学者,想了解这一块还有点早。这涉及到JVM的东西了。JVM需要在后期有基础之后再进行了解。
Bonsour 2017-08-01
  • 打赏
  • 举报
回复
JVM在运行时分了几个区: 方法区、虚拟机栈、堆。 其中方法区和堆是线程共享的,虚拟机栈是线程私有的。根据你上面的这种写法,它只有一个main线程,你定义出来的是局部变量。所以,你的这个变量是线程私有的,它是存储在虚拟机栈中。 你上面说的存在常量池中是错误的说法。常量池中存放的是由final修饰的值。
ImAmelie 2017-08-01
  • 打赏
  • 举报
回复
引用 1 楼 phantom7493 的回复:
刚在网上看到,引用一下
引用
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义   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。在编译器内部,遇到a=4;时,它就会重新搜索栈中是否有4的字面值,如果没有,重新开辟地址存放4的值;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。
没错 我就是对这段有疑问
tobin.wei 2017-08-01
  • 打赏
  • 举报
回复
8种基本类型都是在栈区直接赋值,不经过常量池和堆区
wautsns 2017-08-01
  • 打赏
  • 举报
回复
刚在网上看到,引用一下
引用
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义   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。在编译器内部,遇到a=4;时,它就会重新搜索栈中是否有4的字面值,如果没有,重新开辟地址存放4的值;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧