在java中,变量存储在哪,要看的是变量的声明位置
在方法中声明的局部变量,存储在内存的栈中,包括main方法
则main方法中的基本数据类型是存储在栈中,
但对引用数据类型来说,栈中保存的是它的引用地址,引用数据的数据本身实际存放在堆中。
例如,对于以下变量,a存储在栈中,栈存储了b的引用地址,堆存储了b数据。
public static void main(String[] arg) {
int a=-129;
String b = new String("abc");
System.out.println(a);
System.out.println(b);
}
此外,字符串常量池也在堆中。常量池分为多种,有的在堆中,有的在其他位置,如整数常量池在方法区中。
ps:每个变量其实都有一个唯一指定的内存地址,基础数据类型之所以叫”基本“,是因为简单、常用,所以就直接放在了栈中,随栈被产生和销毁,在使用时根据栈偏移量就可以得到它的地址,而引用数据类型很多,又往往需要共享,所以放在堆中,堆中存放着大量数据,即引用数据本身在堆中,但它不适合通过偏移量得到它的地址,故栈中保存堆中变量的内存地址。