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

 
  1. public class Math 
  2.     ... 
  3.     public static final double PI = 3.14159265358979323846;
  4. ...

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

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

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

 
  1. public class System 
  2.     ... 
  3.     public static final PrintStream out = ...; 
  4.     ... 

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

 
  1. System.out = new PrintStream(...);    //ERROR--out is final 

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