12.3 类变量
到目前为止,你已经见过了局部变量和实例变量,其中局部变量是在方法中声明的,而实例变量是在类定义中声明的,通常位于类定义前面。
局部变量是在方法被调用时创建的,方法结束时,它们占据的内存空间将被收回。实例变量是在创建对象时创建的,在对象被作为垃圾收集时,它们占据的内存空间将被收回。
现在该介绍类变量(class variable)了。与实例变量一样,类变量也是在类定义中声明的,但使用了关键词 static 对其进行标识。它们创建于程序开始运行(或所属类首次被使用)时,直到程序结束才消失。类变量由其所属类的所有实例共享。
public class Card {public static final String[] RANKS = {null, "Ace", "2", "3", "4", "5", "6", "7","8", "9", "10", "Jack", "Queen", "King"};public static final String[] SUITS = {"Clubs", "Diamonds", "Hearts", "Spades"};// 这里为实例变量和构造函数public String toString() {return RANKS[this.rank] + " of " + SUITS[this.suit];}}
类变量常用于存储多个地方要用到的常量值。在这种情况下,还应将它们声明为 final。请注意,决定将变量声明为 static 或 final 时,需要考虑两个不同的因素:如果变量由所有实例共享,那么就将其声明为 static;如果变量为常量,就应将其声明为 final。
对于 static final 变量来说,一种常用的命名约定是采用全大写,这更容易让人知道它们在类中扮演的角色。在方法 toString 中,我们可以像引用局部变量一样引用 SUITS 和 RANKS,但要能够判断出它们是类变量。
将 SUITS 和 RANKS 定义为类变量的另一个优点是,无需在每次调用 toString 时创建它们,也不需要在这个方法执行完毕后将它们视为垃圾进行收集。其他方法和类也可能需要它们,因此让它们在任何地方都可用很有帮助。由于这些数组变量是 final 的,且其元素指向的字符串是不可修改的,因此将它们声明为公有的不会有任何危险。
