本文适合有经验的中高级程序员阅读。
本文不是针对初学者的关于static关键字怎么使用的教程式文章,而是主要侧重于使用它后会有什么现象和问题,属于实践后的经验杂谈。
限于我有限的水平和经验,写的东西不一定准确和全面,还请大家帮助斧正。
一、简单说下教程
可能还是有必要简单说下关键字的static教程,使用 static
修饰符可声明属于类型本身而不是属于特定对象的静态成员。 static
修饰符可用于声明 static
类。 在类、接口和结构中,可以将 static
修饰符添加到字段、方法、属性、运算符、事件和构造函数。如下图:
二、静态方法常驻内存,所以效率高,速度快,但是内存会比较高
这个观点是错误的,对于同一个类的来说,它的内存开销是一样的,效率也没有所谓的更快,因为都是寻址。
三、类的声明
一旦一个类被声明,它将创建该类的所有实例字段的新副本,但static字段只会有一个副本。
同时,类的实例可以通过this进行对象访问,但static不可以。
四、使用static变量可能引发的问题
由于static字段,它一旦声明载入内存后,就一直存在,并且只有一个副本,所以,您对该字段的任何修改,将反映到全生命周期。
这也就是说,使用static字段,要防止值被更改,除非您是故意要这么做。
针对这一特性,static常可被用于运行时设计(Runtime)。这样,您就可以拥有全局的,任意地方都可以使用的公共数据。
五、新手程序员,为什么通篇都是static
这个对于现代化的程序员来说,通常指2012年后的程序员,他们可能由于进入编程的时候,已经相当现代化了,他们并不知道早期计算机出现,及编程发展之初的样子。
其实我也不知道,我是2000年后接触编程,对于70-80年代的那时候的程序员水准我也只能道听途说。
在那编程之初,一切程序理论都在西方构建,还是混沌初开,很多东西都还是摸索阶段,像什么面向对象、设计模式、各种底层设计、各种编程语言、基础算法设计等等,都需要形成和发展。而现代程序员,是享受那时候的人们的思想成果的。
在很早之时,那时候的西方程序员,也只会通篇static,为什么?因为那时候还没有完全形成面向对象的理论知识,一切都在探索摸索,另外,这些西方程序员,跟神国现在的程序员一个样,年轻,都是经验不足的新手,新手能写出什么样的代码来,您懂的。
那么神国的程序员,为什么现在都这么现代了,还是用人家最早期混沌之初的通篇static呢?答案可能是方便,以及娘胎自带的面向过程天生就会。我曾经听过一个程序员面试,他说自己学习和研究的是面向过程,我当时就乐了,面向过程需要您学习和研究吗,您打小天生就会。
六、有了static关键字,又那么方便,为何还要将对象实例化?
这个问题可能是很多人没有思考和想过的问题。是啊,内存一个样,速度也一个样。为啥我就不能通篇static,非要new一个对象?
答案是:面向对象。
随着各种知识理论的形象,面向对象由于良好的健壮扩展维护性等原因,他可以发展出极为方便的不断升级的系统,对于社会进步具有强大的推动作用,所以,这就是需要大家去new一下,而不是老用static的原因。
设想,您老所有类都用static来搞事情,像C#、Java语言。你现在要升级到C#9.0版本,Java N.0版本,你通篇static如何扩展如何维护如何升级,如何推动社会发展?
七、什么时候用static
我们知道,所有的类,只要你愿意,都可以把所有方法改为static,传入参数就可以。所有static也可以转为实例方法,去除static。
嗯,对,什么时候用static呢?有什么原则呢?
我基于个人经验提供一些观点,可能不足不对的地方,请大家指出和斧正:
1.使用实例方法,可以让您的代码采用面向对象,从而非常优美。面向对象的优势我就不说了。
2.当您需要很便捷的去访问一个方法的时候,可以采用static。这个便捷取决于你。
3.当您受到系统的限定,必须使用static时,您没有选择的权利,必须使用。比如对象的扩展方法。
4.当您想要使用Fluent方式来快捷操作一个类的时候,可以采用static方式。
5.您有特殊设计要求,比如生命周期的运行时设计。
祝您用餐愉快。