首先,明确1是字面量,a是变量也是字符引用。(本文使用的是jdk1.8)
其次,分为两种情况a是成员变量和a是局部变量。
a是成员变量时:字符引用a和字面量1都是存储在常量池中的,也即是方法区中。(根据oracle公司的java虚拟机规范写到 :Although the method area is logically part of the heap, simple implementations may choose not to either garbage collect or compact it. 虽然方法区在逻辑上是堆的一部分,但简单的实现可能会选择不收集垃圾或压缩垃圾。)
所以也有人说存储在堆中也是没错的。
a是局部变量:因为基本数据类型的数据是由程序设计语言系统所定义,不可再划分的数据类型,它所占的内存大小固定。在内存中存入的是数值本身。所以a会随着方法进栈,此时字符引用a和字面量1都是在栈中的局部变量表中。