在许多编程语言里面都可以见到static这个关键字,虽然很常见,但是对于它的具体含义我却一直不是很了解,为什么这个要叫做static而不是其他?比如在C,C++,Java,C#里面都有这个关键字,说明这个关键字的字面意思应该是能够表明它的含义的(否则不会这么巧大家都用这个关键字),但是这个关键字的含义又不是那么简单可以望文生义,今天自己花了一些时间看了看,有了个相对清晰的了解.
这个Q&A(What does the keyword ‘static’ mean?)是我最开始找到的资料,问的问题是我想问的,但是答案确不是.
The static keyword denotes that a member variable, or method, can be accessed without requiring an instantiation of the class to which it belongs.
它说明了static关键字所表示的结果含义,但是没有说明为什么代表这个含义使用了static这个关键字.而这个含义其实是有一定编程经验的人都知道的,大家都这么用,但是不知道为什么这个是叫static而不是其他的.
我又继续看了一些资料(参见下面的参考文献),自己总结了一下:
- static这个关键字想要表达的是变量或者方法等的生命周期,而不是访问的作用域的控制,这可以和public,private(Java等语言)这些关键字区分开来.
- static这个关键字的字面含义”静态”说明了由static声明的变量或者函数等的生命周期控制信息的存放地点–静态数据存储区域.
接下来我详细的解释这两点:
- static声明的往往是一个用做全局的变量,类实例等.这个”全局”主要说的是通过static声明,声明的变量等可以增大其生命周期到某个全局的范围,比如Java类里面声明了一个static的变量,则它的生命周期和这个类相同–贯穿程序运行的全过程.因为不会消亡,所以你在引用这一static变量的时候只会引用到同一个变量,看起来就是一个类级别的变量(从结果看起来这样理解也可以,类似与Ruby中的@@来声明变量,但这样很容易知其然而不知所以然).在c语言中并没有类的概念,因此这种说法就不大行得通.在c语言中声明了一个static的变量之后,这一变量的生命周期就可以跨越声明它的文件中的所有函数,当然,这个时候的含义可能也包括了访问控制的含义在里面,但是我理解更主要的还是生命周期的改变.
- 生命周期控制数据的存放地点.要理解这一点,首先要知道有哪些地方可以用来存储程序中使用的数据.对于这一点,文献[1][2]讲述的很清楚,大家可以参考,我就不重复了.主要讲一下随机存储器RAM中的三种存储方式栈,堆,静态存储(stack,heap,static storage).看到这里,大家应该都知道由static声明的话,生命周期相关的信息会存在哪里了吧,至于static这个名字是怎么来的,也不用多说了.对Java来说,
- 一般的不是由static声明的变量,如果是原始的数据类型,会直接保存在stack上,如果是通过new得到的对象实例,这一对象的引用会保存在堆栈上,其实际的数据会保存在heap上,如果这一变量相关的数据被pop出栈,那么这一变量的生命周期也就结束了.如果是对象的话,其在堆上的对应内存也会被释放,这以后就再也无法访问这一对象了.
- 如果是由static声明的变量,不是在stack上存放引用等信息,而是在静态存储区域存放,这样即使堆栈内容变化也不会影响这些变量的创建或者消亡,从而可以不实例化一个类直接通过静态存储区域找到这一变量使用.
这些就是我的一个小结,有部分是我自己的理解,可能不是很正确,请大家指教.
Update: 文献[9]是一篇写的很好的文章,我对static声明函数的含义可能有些曲解,大家可以参考文献[9]最后的static函数及其扩展分析.
参考文献:
- 对象保存在哪里? http://www.qsl.net/bd5hag/JavaCourse/Lesson2/2_9_1.htm
- c storage class http://www.phim.unibe.ch/comp_doc/c_manual/C/SYNTAX/storage_class.html#static
- Static Variable in Wikipedia http://en.wikipedia.org/wiki/Static_variable
- Local Variable in Wikipedia http://en.wikipedia.org/wiki/Local_variable
- Call Stack in Wikipedia http://en.wikipedia.org/wiki/Call_stack
- this and static keyword, Thinking in Java http://columnist.chinabyte.com/xufeng.cq/149/2183649.shtml
- 小议static http://www.csdn.net/develop/Article/20/20219.shtm
- What does the keyword ‘static’ mean? http://www.javacoffeebreak.com/faq/faq0010.html
- static关键字Q/A http://home.zhuonline.net/archives/2005/09/staticqa.html