4.4.2 静态常量

静态变量使用得比较少,但静态常量却使用得比较多。例如,在Math类中定义了一个静态常量:

在程序中,可以采用Math.PI的形式获得这个常量。

如果关键字static被省略,PI就变成了Math类的一个实例域。需要通过Math类的对象访问PI,并且每一个Math对象都有它自己的一份PI拷贝。

另一个多次使用的静态常量是System.out。它在System类中声明:

前面曾经提到过,由于每个类对象都可以对公有域进行修改,所以,最好不要将域设计为public。然而,公有常量(即final域)却没问题。因为out被声明为final,所以,不允许再将其他打印流赋给它:

注释:如果查看一下System类,就会发现有一个setOut方法,它可以将System.out设置为不同的流。读者可能会感到奇怪,为什么这个方法可以修改final变量的值。原因在于,setOut方法是一个本地方法,而不是用Java语言实现的。本地方法可以绕过Java语言的存取控制机制。这是一种特殊的方法,在自己编写程序时,不应该这样处理。