12.3 类变量

到目前为止,你已经见过了局部变量和实例变量,其中局部变量是在方法中声明的,而实例变量是在类定义中声明的,通常位于类定义前面。

局部变量是在方法被调用时创建的,方法结束时,它们占据的内存空间将被收回。实例变量是在创建对象时创建的,在对象被作为垃圾收集时,它们占据的内存空间将被收回。

现在该介绍类变量(class variable)了。与实例变量一样,类变量也是在类定义中声明的,但使用了关键词 static 对其进行标识。它们创建于程序开始运行(或所属类首次被使用)时,直到程序结束才消失。类变量由其所属类的所有实例共享

  1. public class Card {
  2. public static final String[] RANKS = {
  3. null, "Ace", "2", "3", "4", "5", "6", "7",
  4. "8", "9", "10", "Jack", "Queen", "King"};
  5. public static final String[] SUITS = {
  6. "Clubs", "Diamonds", "Hearts", "Spades"};
  7. // 这里为实例变量和构造函数
  8. public String toString() {
  9. return RANKS[this.rank] + " of " + SUITS[this.suit];
  10. }
  11. }

类变量常用于存储多个地方要用到的常量值。在这种情况下,还应将它们声明为 final。请注意,决定将变量声明为 staticfinal 时,需要考虑两个不同的因素:如果变量由所有实例共享,那么就将其声明为 static;如果变量为常量,就应将其声明为 final

对于 static final 变量来说,一种常用的命名约定是采用全大写,这更容易让人知道它们在类中扮演的角色。在方法 toString 中,我们可以像引用局部变量一样引用 SUITSRANKS,但要能够判断出它们是类变量。

SUITSRANKS 定义为类变量的另一个优点是,无需在每次调用 toString 时创建它们,也不需要在这个方法执行完毕后将它们视为垃圾进行收集。其他方法和类也可能需要它们,因此让它们在任何地方都可用很有帮助。由于这些数组变量是 final 的,且其元素指向的字符串是不可修改的,因此将它们声明为公有的不会有任何危险。