![Java无难事:详解Java编程核心思想与技术](https://wfqqreader-1252317822.image.myqcloud.com/cover/59/35011059/b_35011059.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
3.10 常量
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_57.jpg?sign=1738911836-q9j9DBcDmuoSoZOq6PaL6uGVJ9oYgA4l-0-8133037e95349b0a9a557ebe8f6fb3b5)
扫码看视频
常量就是在整个程序运行期间不会改变也不能被改变的固定值。比如数学中的π这个值就是一个常量。在C/C++中,我们可以使用const关键字来定义一个常量,但在Java中,并没有启用const关键字(只是作为保留关键字),要定义一个常量,需要使用final关键字。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_58.jpg?sign=1738911836-IHbClfsYp6PkvgqGS9Y3JF9CKCxWSyKo-0-c3fc8095b3421200e0db91932774d70d)
上面的代码定义了一个常量PI,它的值是3.14。作为一种约定,在定义常量时,常量名通常采用全大写形式。
final常量可以在声明的同时赋初值,也可以在构造方法中赋初值。我们看下面的代码。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_59.jpg?sign=1738911836-ZDrgINEnhHOFnbUNH0TcABsADTbIhs0j-0-c0872b8614d45b2b478f81b8ed13acb1)
切记,当我们重载构造方法时,不要忘记为PI赋初始值。如果在重载的构造方法中忘记了为常量赋初值,那么Java编译器会提示如下的错误:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_60.jpg?sign=1738911836-tLqWaA62yS61Pnfx9jbwlpQMlqmZoT1M-0-d1c00e83de7cc143b86f30e03e9f82cb)
在不同的构造方法中重复为final常量赋初值,一是烦琐,二是容易出错,这时候,就应该合理地使用this来调用其他的构造方法,这样只需要在一个基础的构造方法中编写一次常量的初始化代码就可以了。
final常量一旦赋初值后,就不能被改变,任何试图修改常量的代码在编译时都会被报告错误。既然常量的值不能被改变,那么将其定义为类的实例成员就没有什么意义,反而由于每个对象都拥有一份只读的数据拷贝而增加了内存的占用。因此,在定义常量时通常会将其声明为静态的,如下所示:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_61.jpg?sign=1738911836-UfEyBPsprdayaPnRewvo2Zxp1ZuVLCLr-0-31d24db2ce6b7177b3a80d06b3c49b62)
在这种情况下,就只能在声明常量的同时为常量赋初始值,或者在static语句块中为常量赋值。我们看代码3.16。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_62.jpg?sign=1738911836-Es3Zts5ktZGwfFwDxiGeu5twSXQiQ9EP-0-05a423de70937e8837eb8eb31cf2e052)