关键字解析——static

2 篇文章 0 订阅
在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学习
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值