static -- 静态关键字,在C++与Java之中都很常见。既可以用来修饰变量,也可以用来修饰方法(method in Java)和函数(function in C++).
static 通常是伴随着面向对象才会使用,即在程序定义了类。在类中使用static关键字,无论是方法还是变量,都是属于这个类,而不独属于对象(object)。也就是说,即是一个对象都没有声明,静态变量和方法就已经存在了。通常,当所有类都要使用同一个变量时,就需要静态变量。
不如先说静态方法。静态方法只对静态变量有权限(access),而不能使用类中一般变量和非静态的类中其他方法。原因在于,类中的非静态变量/方法需要有具体对象存在才能使用。而静态方法并不依赖于对象。假设这样的情境,没有一个对象,而使用了静态方法,并尝试去操纵非静态变量,自然会出现错误。为避免这种情况,限定静态方法只对静态变量有权限。相反,非静态方法则对静态&非静态变量都有权限。此外,值得注意的是,this关键字必须要依赖具体对象而存在,因此在静态函数中尝试使用this将导致编译错误。
再来说静态变量的使用。在C++中,使用某一类的静态变量,可以直接用 类名:: 的形式,也可以初始化一个对象,通过 对象名. 的形式。当然写一个access函数也是可以的。在java中,同样可以使用对象名. 或者access函数的方式。不同的是,如果直接使用类名,则是用 类名. 的方式。Anyway,Java中是没有::这样的符号的。比如 Math.PI ,就是以这种方式来调用静态变量PI。当然,我想PI 至少也是final的。
static在两种语言里的差异还不止于此。C++中的static比较tricky。C++认为静态变量不属于任何一个对象,因此尽管在类中声明,其定义却必须在任何对象之外。也就是说,还得在类外定义(define)静态变量。举例来讲,我们有个Employee class
class Employee{
......
static int numEmployees ; // declaration
}
int Employee::numEmployees = 0; //define here
当然了,细究起来说,static在类中声明时最好应该设定为private,并且使用一个静态access函数来获取之。
而在Java中,则可以直接在类中声明并初始化(即使不初始化也会默认初始化),无须在类外再做定义。Java中还有static import之说,用来获取别的package中的静态变量或者接口,并且,在使用时无须在加上类的名字和 .(dot)号。
import static java.lang.Math.*;
public class test{
public static void main(String[] args){
System.out.printf("sqrt(PI) = %.3f%n",sqrt(PI)); // here sqrt and PI are both static
}
}
注意到,Java中的main函数就是静态的。个人愚见,Java是OO程度很高的语言,然而应用中难免会需要面向过程语言的便利。个人使用感觉是,静态函数像是一种妥协,当你需要自己写一些独立于一般class的函数时,就需要静态函数。