java中没有全局变量这一说法,只有static和非static变量。如果需要完成类似全局变量的功能,则可以定义static变量PI,再用类方法调用(如Math.PI)即可。——引用
由此我想要好好分析下static变量的特性,先从我熟悉的C++分析起。
static定义静态变量,在C++中,静态存储特性分为三种:外部链接特性、内部链接特性和无链接性。外部链接特性对应在代码块外声明的变量,内部链接性对应在代码块外声明的用static限定符修饰的变量,无链接性对应代码块内声明的用static限定符修饰的变量。
由static修饰的变量,其作用域被限制在其定义区间内; 链接特性则由其定义的位置决定,链接特性主要是为了多个程序或多个文件共享一段数据;第一种其实就是全局变量,程序所有函数均可调用(只可在一个文件中进行定义声明),其定义声明须在代码块外进行,不需关键字修饰,且可在定义声明的同时进行初始化,而引用声明则是在其他代码块内想要引用该全局变量时所需进行的,需要关键字extern修饰,且不可在引用声明时进行变量赋值,当然也可使用::来表示需要引用全局变量;
第二种文件内部静态变量,在本文件中它不会被在其他文件中定义声明的全局变量所替代,有点类似只为该文件内程序所共享的私有数据段;
第三种代码内部静态变量,虽然只在该代码块内使用,但是它在代码块不工作的时候也存在,因此在两个函数调用时其值不变,如果初始化了静态变量,则只在程序启动时执行,后面再调用该函数时则不会像普通变量那样再重新被初始化。
对于java 可以进行类比,由于java一切都是面向对象,因此不存在类之外进行定义变量的情况,因此,C++中的外部链接特性静态变量可以认为是java中的public变量,内部链接特性静态变量可以认为是java中private static 的变量,而无连接性变量则可认为是java方法中所定义的static变量。