(一)首先来谈谈在C中的作用,分为修饰变量和修饰函数两种情况:
(1)修饰变量,变量分为局部静态变量和全局静态变量,他们都存在内存的静态区,静态全局变量的作用域仅限于变量被定义的文件中,准确的说:是从定义之处开始,到文件结尾处结束。静态局部变量,就是函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他函数都不能用。由于被static修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值也不会被销毁,函数下次使用时仍然能用到这个值。
(2)修饰函数,函数前加static使得函数称为静态函数,函数的作用域仅限于本文件,所以又称为内部函数。
(二)在java中的作用,分为修饰成员变量和修饰成员方法,形成静态代码块。
(2.1)被static修饰的成员变量和成员方法独立于该类的任何对象,也就是说它不依赖于类的特定实例,只要类被加载了,就可以通过类名来访问。方便在没有创建对象的时候来进行调用;
(2.2)只分配一次内存,所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间。声明为static的变量实质上就是全局变量。
(2.3)在static方法中 static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
(2.4)虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。
(2.5)类中定义的静态代码块会优先于构造块先执行,而且不管有多少个对象,静态代码块只执行一次;类中static块程序是在类被装载的时候开始执行。而不是在创建对象的时 候执行。
(2.6)在C/C++中static是可以作用域局部变量的,但是在Java中切记:static是不允许用来修饰局部变量。
(2.7)static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。
(2.8)在涉及到继承的时候,会先初始化父类的static变量,然后是子类的,依次类推
(2.9)static关键字不会改变类中成员的访问权限