作用: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来实现