
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
变量与常量是程序员在开发软件的时候会经常用到的一个编程元素,下面我们就通过案例分析来了解一下,java编程开发常量类型都有哪些。
Class常量池
在class文件中除了有类的版本、字段、方法和接口等描述信息外,还有一项信息是常量池(ConstantPoolTable),用于存放编译期间生成的各种字面量和符号引用。
符号引用
一个java类(假设为People类)被编译成一个class文件时,如果People类引用了Tool类,但是在编译时People类并不知道引用类的实际内存地址,因此只能使用符号引用来代替。
而在类装载器装载People类时,此时可以通过虚拟机获取Tool类的实际内存地址,因此便可以既将符号org.simple.Tool替换为Tool类的实际内存地址,及直接引用地址。即在编译时用符号引用来代替引用类,在加载时再通过虚拟机获取该引用类的实际地址。以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。
符号引用与虚拟机实现的内存布局是无关的,引用的目标不一定已经加载到内存中。
字面量
文本字符串Stringa="abc",这个abc就是字面量
八种基本类型inta=1,这个1就是字面量
声明为final的常量
运行时常量池
运行时常量池(RuntimeConstantPool)是每一个类或接口的常量池(Constant_Pool)的运行时表示形式,它包括了若干种不同的常量:
从编译期可知的数值字面量到必须运行期解析后才能获得的方法或字段引用。(这个是虚拟机规范中的描述,很生涩)
运行时常量池是在类加载完成之后,将Class常量池中的符号引用值转存到运行时常量池中,类在解析之后,将符号引用替换成直接引用。
运行时常量池在JDK1.7版本之后,就移到堆内存中了,这里指的是物理空间,而逻辑上还是属于方法区(方法区是逻辑分区)。
在JDK1.8中,使用元空间代替永久代来实现方法区,但是方法区并没有改变,所谓"Yourfatherwillalwaysbeyourfather"。变动的只是方法区中内容的物理存放位置,但是运行时常量池和字符串常量池被移动到了堆中。但是不论它们物理上如何存放,逻辑上还是属于方法区的。
字符串常量池
字符串常量池这个概念是有争议的,对于虚拟机规范等很多正式文档,发现没有这个概念的官方定义,所以与运行时常量池的关系不去抬杠,我们从它的作用和JVM设计它用于解决什么问题的点来分析它,暂且把它理解为在方法区中的一块区域。
以JDK1.8为例,字符串常量池是存放在堆中,并且与java.lang.String类有很大关系。设计这块内存区域的原因在于:String对象作为Java语言中重要的数据类型,是内存中占据空间大的一个对象。高效地使用字符串,可以提升系统的整体性能。所以要彻底弄懂,我们的重心其实在于深入理解String。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。