常量池中主要存放两大类常量:字面量和符号引用。字面量比较接近Java语言层面的常量概念,如文本字符串、被声明为final的常量值等。符号引用则属于编译原理方面的概念,主要包含下面几类常量:
1)被模块导出或者开放的包。
2)类和接口的全限定名。
3)字段的名称和描述符。
4)方法的名称和描述符。
5)方法句柄和方法类型
6)动态调用点和动态常量。
Java代码在进行Javac编译的时候,并不像C和C++那样有“连接”这一步骤,而是在虚拟机加载Class文件的时候进行动态连接。也就是说,在Class文件中并不会保存各个方法、字段最终在内存中的内存入口地址,也就无法直接被虚拟机使用。当虚拟机做类加载时,将会从常量池获得对应的符号引用,再在类创建时或运行时解析、翻译到具体的内存地址之中。