9-3 static关键词

static有全局与静态的意义,这是一个修饰词,可以用于修饰成员变量、成员方法或是在程序中有一个独立的static程序代码区块。其实当用public修饰static的成员变量和成员方法时,本质上就成了全局变量和全局方法。

类的静态(static)成员与非静态成员最大的差别是静态(static)成员无需实体(instance)就可以直接存取,非静态成员必须先用new建立一个实体(instance)才可以访问,所谓的实体即是指对象。

9-3-1 static成员变量

如果一个类的成员变量有static修饰时,表示所有此类的对象可以共享此static成员变量,而不是每一个此类的对象有一份各自独立的成员变量,也因为如此所以又称全局变量。

程序实例ch9_16.java:没有static修饰词时,建立对象并输出对象内容。

执行结果

可以用下列内存图示说明上述实例。

从上图可以了解,类对象的成员变量会各自有一份独立的数据区,至于成员方法则是独立存在,各类对象则是有指向此方法的内存区。

程序实例ch9_17.java:重新设计ch9_16.java,将age设为static,然后看这个程序的执行结果。

执行结果

在上述执行结果可以发现,在第14行设置Peter的年龄是20,但是执行结果显示Peter的年龄是30,主要是因为在第2行将age设为static,这时所有的对象将共享此静态(static)成员变量。可以用下列内存图示说明上述实例,当执行完第14行后内存图示如下所示。

当执行完第17行后内存图示如下所示。

由于静态(static)只有一份,所以最后列出Peter和John的岁数是30。

9-3-2 使用类名称直接存取

在9-3节有说明不需要实体(instance)就可以直接存取静态(static)成员变量,所使用的就是直接用类名称存取static成员变量。

程序实例ch9_18.java:这是一个直接使用类名称存取static成员变量的实例,可参考第15行和第20行,读者可以发现在建立对象前或是建立对象后存取static成员变量。

执行结果

9-3-3 静态成员变量的初始区块

静态初始化区块是指Java在类的声明中,增加static左右大括号区块,然后在这个区块中可以初始化此类的static成员变量。它的使用语法如下:

程序实例ch9_19.java:静态初始化区块的使用说明,这个程序的第4~6行就是静态初始化区块。

执行结果

上述第22行可以使用“类名称.静态成员变量”存取,我们又称之为类变量(Class Variable)。而后需要建立对象,然后使用“对象名称.静态成员变量”存取,我们又称之为实体变量(Instance Variable)。

9-3-4 将static成员变量应用于人数总计

由于static成员变量具有共享的特性,所以在使用上应该将它应用在具有全局变量的概念的地方,下面将使用一个实例,将static成员变量应用于人数总计。

程序实例ch9_20.java:这个程序的static成员变量counter在第2行设置,另外还设置了人员id和人员姓名name,每次建立NBAteam对象时,都会执行构造方法(第8~10行),更新人数总计同时将当时人数总计设置给id,也当作id编号。

执行结果

9-3-5 static方法

static除了可以应用于类的成员变量,也可以应用于类的方法。一个标识为static的方法,除了可以使用类对象名称调用外,也可以使用类名称调用。

程序实例ch9_21.java:这个程序主要是展示在没有建立任何类对象时,仍然可以使用类名称调用static方法,然后这个程序也展示了正常使用类对象名称调用static方法。

执行结果

在设计static方法时须留意不可使用this关键词、非static的成员变量和非static的方法,因为我们可以在没有声明类对象情况下使用static成员变量和方法,而非static的成员变量和非static的方法需要在有对象的情况下才可以使用。

9-3-6 认识main()

当程序加载一个Java文件时,会先去寻找main(),所以必须将main()声明为public,由于其他方法会回传数据给main(),而main()则无须回传任何数据,所以将main()声明为void。由于程序一执行时,main()就会加载到内存内,所以必须将它声明为static。所以我们看到了下面main()的声明。

public static void main(String[ ] args)

看了以上叙述,可以说main()其实就是public static void的方法。另外,启动程序时如果有参数要传入程序,可以使用参数列(String[ ] args),这是字符串数组,args是Java程序设计师习惯使用的字符串数组变量名称,也可以使用其他任何名称。

9-3-7 final关键词与static成员变量

在3-4节有介绍final关键词的用法,其实也可以将它应用于static成员变量。当设计一个类时,如果static成员变量的数据是固定的,未来不再更改,则可以将final关键词应用于static成员变量上。

程序实例ch9_22.java:假设悠游卡最多储值空间是1000元,我们使用final static成员变量valueAdd定义此变量,这是一个尝试修改final static成员变量valueAdd造成程序错误的实例。

执行结果