static变量的作用及引申

来源:互联网 发布:mac怎么玩美服不延迟 编辑:程序博客网 时间:2024/04/30 09:22

作用:1,具有“记忆”的功能,一个被声明为静态的变量在这一函数被调用的过程中其值维持不变。
2,在模块内(但在函数体外),它的作用域范围是有限制的,即如果一个变量被声明为静态的,那么该变量可以被模块内所有函数访问,但不能被模块外其他函数访问。
3,内部函数应该在当前源文件中说明和定义,对于可在当前源文件以外使用的函数,应该在一个头文件中说明,使用这些函数的源文件要包括这个头文件。

和全局变量相比,使用静态数据成员的优势:
1,静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性。
2,可以实现信息的隐藏。静态数据成员可以是private成员,而全局变量不能。

引申1:为什么static变量只初始化一次?
对于所有的对象(不仅仅是静态对象),初始化都只有一次;但静态变量具有“记忆”功能,初始化之后,一直没有被销毁,都会保存在内存区域中,所以不会再次初始化。
存放在静态区的变量生命周期比较长,一般与整个源程序“同生死,共存亡”(java中是随着类的加载而加载,随着类的消失而消失),所以它只需初始化一次。

例子程序:
#include <stdio.h>
#include <stdlib.h>
void fun(int i)
{
    static int value = i++;
    printf("%d\n",value);
}
int main()
{
    fun(0);
    fun(1);
    fun(2);
    return 0;
}

输出结果为0;0;0

#include <stdio.h>
#include <stdlib.h>
void fun(int i)
{
    static int value = i++;
    value = i++;
    printf("%d\n",value);
}
int main()
{
    fun(0);
    fun(1);
    fun(2);
    return 0;
}

输出结果为:1;1;2

解析:调用fun(0)时,由于value被声明为static,所以定义语句只执行一次,此时value =++,value的值为0,i值变为1,执行第二行语句value = i++后,此时value的值为i的初值为1,接着i的值变为2,所以第一次输出为1.当调用fun(1)时,因为value是静态变量,具有记忆功能,所以会跳过定义语句,只执行value = i++语句,所以value的值为i的值为1,接着i的值变为2,所以第二次输出为1。当调用fun(2)时,也会跳过定义语句,只执行value = i++语句,所以value的值为i的值为2,接着i的值变为3,所以第二次输出为2。

注意:在一些环境下,C语言成员的初始化必须是常量,所以有些情况下,static int value = i++;是有错误的。

引申2:在头文件中定义静态变量,是否可行?为什么?
不可行,如果在头文件中定义静态变量,会造成资源浪费的问题,同时也可能引起程序错误。因为如果在使用了该头文件的每个C语言文件中定义静态变量,按照编译的步骤,在每个头文件中都会单独存在一个静态变量,从而会引起空间浪费或者程序错误。


java中final和static总结 
一.final总结
 
  1.final修饰类:表示该类不可继承,final不能修饰interface接口
  2.final修饰方法:表示该方法不能被子类覆盖(即子类不能重写父类的final方法,可以继承),final不能修饰构造函数
  3.final修饰字段属性:表示属性值第一次初始化后不能被修改
  final属性可以直接初始化或在构造函数中初始化,如果属性是直接初始化,则其值不能被其它函数(包括构造函数)修改
  4.final修饰函数参数,参数值不能被函数修改
  5.final修饰函数中的局部变量,局部变量被第一次初始化后不能被修改
   public void hello() {
  final String name;
  name = "hi";       //ok
  name = "hello";    //error
  }
  使用final的意义:
  第一,为方法“上锁”,防止任何继承类改变它的本来含义和实现。设计程序时,若希望一个方法的行为在继承期间保持不变,而且不可被覆盖或改写,就可以采取这种做法。
  第二,提高程序执行的效率,将一个方法设成final后,编译器就可以把对那个方法的所有调用都置入“嵌入”调用里(内嵌机制)。

  二.static总结
  1.static修饰成员函数:该成员函数不能使用this对象
  static不能修饰构造函数
  static不能修饰函数参数
  static不能修饰局部成员变量
  2.static修饰成员字段
  当类被虚拟机加载时,首先按照字段声明的先后顺序对static成员字段进行初始化
  3.static修饰语句块
  当类被虚拟机加载时,按照声明顺序先后初始化static成员字段和static语句块
  static所修饰的方法和字段是只属于类,所有对象共享。
  在static所修饰的函数和语句块中不能使用非static成员字段。
  在Java不能直接定义全局变量,是通过static来实现的
  在Java中没有const,不能直接定义常量,通过static final来实现

 

原创粉丝点击