int aaa = 1024;
请问这条语句的aaa变量的名称“aaa”存放在哪里?看了帖子http://hi.baidu.com/wolf_childer/item/c9f906d2c8229613d90e44d2学习了内存分配,又看了百度百科http://baike.baidu.com/view/8680346.htm关于常量池的介绍。现在自己的理解是:
还是变量名称都以字符串的形式在常量表中呢?
请问这条语句的aaa变量的名称“aaa”存放在哪里?看了帖子http://hi.baidu.com/wolf_childer/item/c9f906d2c8229613d90e44d2学习了内存分配,又看了百度百科http://baike.baidu.com/view/8680346.htm关于常量池的介绍。现在自己的理解是:
还是变量名称都以字符串的形式在常量表中呢?
public class T {
int aaa = 1024;
}使用javap -verbose T可以看到const #5:(这个命令要在T.class所在的目录下执行)
E:\workbench\back\bin>javap -verbose T
Compiled from "T.java"
public class T extends java.lang.Object
SourceFile: "T.java"
minor version: 0
major version: 50
Constant pool:
const #1 = class #2; // T
const #2 = Asciz T;
const #3 = class #4; // java/lang/Object
const #4 = Asciz java/lang/Object;
const #5 = Asciz aaa;
const #6 = Asciz I;
const #7 = Asciz <init>;
const #8 = Asciz ()V;
const #9 = Asciz Code;
const #10 = Method #3.#11; // java/lang/Object."<init>":()V
const #11 = NameAndType #7:#8;// "<init>":()V
const #12 = Field #1.#13; // T.aaa:I
const #13 = NameAndType #5:#6;// aaa:I
const #14 = Asciz LineNumberTable;
const #15 = Asciz LocalVariableTable;
const #16 = Asciz this;
const #17 = Asciz LT;;
const #18 = Asciz SourceFile;
const #19 = Asciz T.java;{
int aaa;public T();
Code:
Stack=2, Locals=1, Args_size=1
0: aload_0
1: invokespecial #10; //Method java/lang/Object."<init>":()V
4: aload_0
5: sipush 1024
8: putfield #12; //Field aaa:I
11: return
LineNumberTable:
line 2: 0
line 3: 4
line 2: 11 LocalVariableTable:
Start Length Slot Name Signature
0 12 0 this LT;
}
程序在运行中并没有用到本地变量表,这些变量的位置在编译的时候已经确定,
比如iload_1就是将第一个本地变量放到操作栈。
aaa属于有具体大小的数值,应该是存储在“堆栈”中。
如果是static int aaa = 1024;
那么应该是存储在“静态存储”中。
int aaa = 1024;
继续刚才的说法,1024应该是存储在栈空间里,而基本数据类型的变量名称aaa应该存放在常量池里。
对于int aaaa = 1024 ;其是存放在栈里面的,因为栈存放的是基本类型的数据和引用;aaaa也是在
栈内存中,而且这个变量名就标识着那个存储数据的内存空间,jvm就是通过这个变量名来操作该内存空间的。
也有人认为会涉及到常量池,我觉得没有这个可能,因为常量池是用来存储字符串常量和基本数据常量的,
而aaaa明显不是常量,因为常量是不可变的,aaaa可以被赋予其他值,所以不是,而且很明显的标志就是
基本数据常量会被static final修饰。