近来在各种语言之间往返编程,容易产生杂乱,这里特意整理下:
一. c语言(面向过程)
在c语言中static 可以修饰变量跟函数,而且修饰后,只在本文件中可见,别的文件中可以使用同名变量或函数。因此添加static 有利于团队协作中出现定名类似编译辨认的环境。
1. 修饰变量
在先容修饰变量作用之前,读者应该要对c步伐存储结构有肯定的认知,存储结构分析。
(1) 存储方式:
种别 |
局部变量存储位置 |
全局变量存储位置 |
修饰 |
静态存储区(.data段) |
静态存储区(.data段) |
不修饰 |
栈(stack) |
静态存储区(.data段) |
(2)作用和可见性:
种别 |
局部变量 |
全局变量 |
修饰 |
函数退出后数据不会打扫 |
仅在同文件下全局可见 |
不修饰 |
函数退出后主动打扫数据 |
步伐内全局可见 |
2. 修饰函数
(1)
种别 |
有无static |
可见性 |
静态函数 |
有static |
静态函数只是在声明他的文件当中可见,不能被其他文件所用。 |
平凡函数 |
无static |
步伐内可见,默认自带extern |
二. 面向对象类语言
在先容语言修饰作用前,先分析一下,语言发展关系:c (面向过程)—> c++ 、c#、java、go、php、python (面向对象), 从中我们可以看出其他面向对象的语言是由c发展而来的,在存储和作用上会有肯定的相似性。由于面向对象有个共同特点就是增长了类,以是下面重要先容 staic 对类的影响。
在使用类成员中,我们通常须要创建一个对象,通过对象来访问类成员。而使用static修饰后会改变访问方式。this被即为本对象,成员函数被static修饰之后,不能使用this。
在运用多种编程语言中,可以发现带static 的 类函数,可以方便被直接调用,而不须要使用new 创建对象。
不外由于类静态函数不能访问非静态函数,因此在某些时间容易产生错误。
1. C++
(1)C++ 继续c语言的面向过程,以是具备c的特性
(2)修饰类成员
语言 |
作用 |
可见性 |
调用格式 |
变量 |
静态成员变量是每个类有一份,平凡成员变量是每个实例有一份 |
变动 |
<类名>::<类变量> |
函数 |
静态成员函数,可以用类名::函数名举行访问,但无法使用this,仅能访问类的静态数据和静态成员函数。 |
变动 |
<类名>::<函数名>或<对象名>.<函数名> |
增补注意点:
- 静态成员函数不能访问非静态(包罗成员函数和数据成员),但黑白静态可以访问静态。
- 不能将静态成员函数界说为虚函数。
- 静态成员变量所在是指向其数据范例的指针 ,静态成员函数所在范例是一个“nonmember函数指针”。
- 为了防止父类的影响,可以在子类界说一个与父类类似的静态变量,以屏蔽父类的影响。
2. JAVA
(1)简介
在java语言中类中的函数被称为方法。
在《Java编程头脑》中有如许一段话:
“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的条件下,仅仅通过类本身来调用static方法。这实际上正是static方法的重要用途“。这段话固然只是分析白static方法的特殊之处,但是可以看出static关键字的根本作用,简而言之,一句话来形貌就是:
方便在没有创建对象的环境下来举行调用(方法/变量)。
(2) 其他作用
- static关键字尚有一个比力关键的作用就是 用来形成静态代码块以优化步伐性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时间,会按照static块的序次来实验每个static块,而且只会实验一次。
class 类名{
private String test;
static{
test = "test";
}
}
- static是不答应用来修饰局部变量。
- static关键字不会影响到变量大概方法的作用域。在Java中可以大概影响到访问权限的只有private、public、protected(包罗包访问权限)
3. 其他语言
! |