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

java常量的问题
java中如果
public static void main(String args[])
{
int a=9;
}
在主函数中定义一个a这个a是存储在常量池中还是main函数的栈中?
我知道如果Integer a=9;的话肯定是在常量池中;
求明白的,解释一下;或者推荐一篇文章让我明白一下;

------解决方案--------------------
在java栈的局部变量区
Integer a=9;等价于Integer a = Integer.valueOf(9);在堆中

java栈更多信息:http://www.ticmy.com/?p=151
------解决方案--------------------

int 是基本类型,直接存数值 
Integer是类,产生对象时用一个引用指向这个对象
Java把内存划分成两种:一种是栈内存,另一种是堆内存 
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配 
而实际的对象是在存储堆内存中 
即 
int i = 9;//直接在栈中分配空间 
Integer i = new Integr(9);//对象是在堆内存中,而i(引用变量)是在栈内存中 
在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理.

------解决方案--------------------
LS都说了,就补充说一说
基本类型是保存在栈里的
Integer a=9;相当于Integer a=Integer.valueOf(9); 当valueOf的参数在[-128,127]之间的时候,直接返回缓存区的Integer对象(IntegerCache的Integer数组元素),在这个过程中,常量池并没有保存任何Integer对象信息,不要被常量池误导,也不要以为常量池保存了Integer对象,基本类型就会指向常量池的对象,要知道基本类型不是引用(指针),只能保存值,并不保存对象地址

可以通过javap来查看常量池信息以及是否发生了常量池相关的指令

Java code
public class jp {
    public static void main(String[] args) {
        int i = 5;
        int j = Short.MAX_VALUE;
        int k = Short.MAX_VALUE + 1; //常量池
        Integer n = 9;
        String a = "abc"; //常量池
    }
}