本文主要是介绍Java之常量的概念,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Java之常量的概念
- 零基础学Java
- 什么是常量
- 常量的分类
- 了解下常量池
- 动动手练习题
零基础学Java
Java学习交流 : V:study_51ctofx
什么是常量
常量:程序运行中,固定不变的量
两种表现形式:
字面常量和final修饰的常量
public static void main(String[] args){//其中 1 为字面常量,固定不变的量int a = 1;//或者这里的 1 也是字面常量System.out.println(1);//第二种final修饰的常量final int b = 1;final int c;c = 1;c = 2;//此时代码会报错,final修饰的变量只能被赋值一次,不能被修改//上面的b和c通过final修饰后,不允许被修改,因此是固定不变的量
}
常量的分类
字符串常量、小数常量、整数常量、字符常量、布尔常量(true、false)、空常量(null);
public static void main(String[] args){//字符串常量,双引号内允许一个或者多个字符System.out.println("study_51ctofx");//小数常量System.out.println(3.14)//整数常量System.out.println(1);//字符常量,单引号内允许一个字符,\u0000(Unicode编码), 表示一个空白字符System.out.println('a');System.out.println('\u0000');//布尔常量System.out.println(true);//空常量System.out.println(null);
}
了解下常量池
常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享,同时节省内存开销。
例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。
常量池一般分:Class常量池(静态常量池)、运行时常量池、字符串常量池
Class常量池:
当java文件被编译成class文件之后,会在class文件中生成我们所说的class常量池,class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种字面量(文本字符串、被声明为final的常量、基本数据类型的值)和符号引用(类和接口的全限定名、字段的名称和描述符、方法的名称和描述符)。
运行时常量池:
当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中,在上面我也说了,class常量池中存的是字面量和符号引用,也就是说他们存的并不是对象的实例,而是对象的符号引用值。而经过解析(resolve)之后,也就是把符号引用替换为直接引用,解析的过程会去查询字符串常量池,也就是我们上面所说的string pool,以保证运行时常量池所引用的字符串与字符串常量池中所引用的是一致的。
符号引用:在编译时,java类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。比如org.simple.People类引用了org.simple.Language类,在编译时People类并不知道Language类的实际内存地址,因此只能使用符号org.simple.Language(假设是这个,当然实际中是由类似于CONSTANT_Class_info的常量来表示的)来表示Language类的地址。直接引用:直接引用可以是直接指向目标的指针
字符串常量池(string pool):
字符串常量池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool中(记住:string pool中存的是引用值而不是具体的实例对象,具体的实例对象是在堆中开辟的一块空间存放的)。string pool在每个HotSpot VM的实例只有一份,被所有的类共享。在jdk1.8后,将String常量池放到了堆中。
动动手练习题
Java题库在线答题:www.51ctofx.com
这篇关于Java之常量的概念的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!