您的位置:首页 > 其它

关键字解析——static

2007-04-14 18:26 260 查看
在C、C++、Java等语言中,都有static关键字,作为一个英语单词来讲,这个词的基本含义是“静态的、固定的”。顾名思义,这个词是用来声明静态对象的。
1、C语言中的static
C语言程序可以看成由一系列外部对象构成,这些外部对象可能是变量或函数。而内部变量是指定义在函数内部的函数参数及变量。外部变量定义在函数之外,因此可以在许多函数中使用。由于C语言不允许在一个函数中定义其它函数,因此函数本身只能是“外部的”。
由于C语言代码是以文件为单位来组织的,在一个源程序所有源文件中,一个外部变量或函数只能在某个文件中定义一次,而其它文件可以通过extern声明来访问它(定义外部变量或函数的源文件中也可以包含对该外部变量的extern声明)。
而static则可以限定变量或函数为静态存储。如果用static限定外部变量与函数,则可以将该对象的作用域限定为被编译源文件的剩余部分。通过static限定外部对象,可以达到隐藏外部对象的目的。因而,static限定的变量或函数不会和同一程序中其它文件中同名的相冲突。如果用static限定内部变量,则该变量从程序一开始就拥有内存,不会随其所在函数的调用和退出而分配和消失。[1]

2、C++中的static
由于C++基本上兼容C语言的特性,为了区别,将C中继承过来的static用法称为文件静态(file static)。C++不赞成文件静态,已经用未命名的命名空间代替它。
局部静态变量在函数第一次调用之前就已经创建和初始化,其值在函数的调用之间保持有效。
类的static成员,独立于该类的任意对象而存在;每个static数据成员是与类关联的对象,而不是与该类的对象相关联。使用static成员而不是 全局对象有三个优点:(1)static成员的名字是在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突。(2)可以实施封装。static 成员可以是私有成员,而全局对象不可以。(3)通过阅读程序容易看出static成员是与特定类关联的,因此也很容易理解编程者的意图。
类的static成员独立于任何对象而存在,不是类型对象的组成部分。

3、Java中的static
由于Java中不存在全局的对象,所有内容都封装在类中(也可以是Interface或enum),这就决定了static关键字跟C++中的类的static成员用法比较一致。除了可以用于声明内部变量或函数之外,static也可以用于声明内部类,如果内部类被声明为static时,则可以不用实例化外部的那个类就可以使用。




public class Test ...{


int tmp1;


static int tmp2;






public static void main(String[] args) ...{


Test t=new Test();


A a=new A();


B b=t.new B();


System.out.println(a.i);


System.out.println(b.i);


System.out.println(t.tmp1);


System.out.println(tmp2);


}






static class A ...{


int i=2;


}




class B ...{


int i=2;


}


}

注意到内部类B,必须首先实例化一个外部类Test才可以调用。另外,注意到在static函数main()中,需要通过实例化的Test来访问tmp1,如果没有指明实例化的t,则会在编译时不能通过(non-static variable tmp1 cannot be referenced from a static context);但是可以直接访问tmp2。static不能用于修饰外部类。
在Java中,static还可以直接修饰一个静态块,其用法是static {……}。这个静态块有点类似于静态函数,因此要求其中访问到的变量或函数都已经实例化了的,也就是在必须在内存中实际已经存在了的。

参考:
[1] Brian W. Kernighan, Dennis M. Ritchie.(徐宝文,李志 译,尤晋元 校) C程序设计语言(第二版·新版)。
[2] Stanley B. Lippman, Josee Lajoie, Barbara E. Moo. (李师贤 蒋爱军 李晓勇 林瑛 译)C++ Primer中文版。
[3] Java之static学习
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: