java 核心技术-12版 卷Ⅰ- 4.4.2 静态常量
原文
静态变量使用得比较少,但静态常量却很常用。例如,Math 类中定义了一个静态常量:
public class Math{
// ....
public static final double PI = 3.14159265358979323846;
}
在你的程序中,可以用 Math.PI 来访问这个常量。
如果省略关键字 static , 那么PI 就变成了Math 类的一个实例字段。也就是说,需要通过Math 类的一个对象来访问PI ,并且每一个Math 对象都要它自己的一个PI 副本。
另一个你已经多次使用的静态常量是System.out 。 它在System类中声明如下
public class System{
// ...
public static final PrintStream out = null;
}
前面曾经多次提到过,最好不要有公共字段,因为谁都可以修改公共字段。不过,公共常量(即final 字段)却没问题。因为out 被声明为final ,所以,不允许再将它重新赋值为另一个打印流:
System.out=new PrintStream(..);// ERROR -- out is final
注释:如果查看System类,就会发现有一个setOut方法可以将System.out设置为不同的流。你可能会感到奇怪,为什么这个方法可以修改final 变量的值。原因在于,setOut方法是一个原生方法,而不是在Java语言中实现的。原生方法可以绕过Java语言的访问控制机制。这是一种特殊的解决方法,你自己编写程序时不要模仿这种做法。