跟我学Java基础(三):常量
在上一篇文章 中,重温了Java中的变量和变量的初始化,当然,也包括了一些简单的命名规范,以及相关注意事项等。
本章将介绍Java中的常量。
声明一个常量非常简单,使用final关键字即可。如:
众所周知,关键字final表示当前变量只能被赋值一次,一旦赋值,即不可更改。
常量名一般要使用全大写。
我们在使用常量的过程中,经常在多个类的多个地方使用,这也是为何要声明常量的原因。
另外,这些常量分散在各个类中,以后维护也不太方便,所以,一般来说,定义一个专门的类,来存储所有或者部分相关的常量,是一个比较好的习惯。如:
注意,由于这些常量都是public修饰的,所以,其它类的方法均可以直接引用。
https://github.com/liuminglei/ReviewJavaFoundation/tree/master/03
https://gitee.com/xbd521/ReviewJavaFoundation/tree/master/03
Java字面常量与常量池
Java中的字面常量(区别于final创建的有名常量)通常会保存在常量池中,常量池可以理解为像堆一样的内存区域。但是常量池有一个特性就是,如果常量池中已存在该常量将不会再次为该常量开辟内存
还是看个程序:
输出结果为:
s1所引用的字符串对象是字面常量,会存储在常量池,
s2所引用的字符串对象也是字面常量,而且常量“张汉青”在常量池中出现过,所以Java并不会为s2所引用的对象开辟新的内存而是让s2直接引用之前存在的\”张汉青\”
内存中的模拟:
所以s1==s2为true;
s3是用new创建的,该对象的内存应该位于堆;
所以s1==s3为false
除了String类的字面常量会用到常量池,Java基础类型的包装类也会用到常量池,包括Byte,Short,Integer,Long,Character,Boolean;
所以I==J==Q为true
要注意Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127时才可使用对象池,也即对象不负责创建和管理大于127的这些类的对象
所以k==g为false
另外double和float并没有实现常量池技术。
所以d==e为false
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。