日期:2014-05-17  浏览次数:20728 次

我对java中static的理解
以前,java中static关键字给我的影响是“小心使用”“危险”。因为被static关键字修饰的东西,就意味这它会被共享,所以觉得应该小心。最近又在使用play框架,发现里面到处都是static方法(我指的是model层和control层,而play的lib里面我不清楚),于是迫不及待的到play框架群里面去问问题:“play框架里面为什么有那么多的static关键字?”然后群里就有3个大哥在讨论,一开始我还能看懂,聊着聊着,各种技术上的例证来了,我表示完全看不懂他们在说什么了。看了他们的讨论,我也百度了很多文章,发现我的问题不好,我觉得static的具体使用不应该和具体的框架绑在一起,我的问题可以变成诸如“什么时候使用static?”“使用static的原则是什么?”“类方法和实例方法的区别是什么?”,当然这些问题,我都百度过了,我对这个问题的理解是:类中的一个方法如果不改变该类的状态,那么他可以是static的,反之就应该是non-static方法。所以我对static的理解就很简单了,凡是充当“工具”使用的方法,就可以用static修饰(比如Math类)。然后在回到play里面看static的问题,我觉得使用static的原则还是一样的,不改变类状态的方法就属于实例方法,如果是作为“工具”,那么就用static。我还看到http://stackoverflow.com/questions/5192904/play-framework-uses-a-lot-of-statics,话说一楼就是play框架开发成员之一,我觉得他说的,和我理解的应该是一样的。

话说回来,虽然群里面的3为大哥讨论的很多内容我不懂,但是其中以为大哥说:“只要明白这句话,那么很多疑惑就能解开:持有数据的对象提供对这些数据操作的方法!”

我想来想去,表示很遗憾,还是不理解他说的这句话和static的用法有什么关系?

我理解的static也就这么浅了,请问大家是什么看法,说不定一讨论,我又能理解的更深了。

------解决方案--------------------
要看你用static修饰谁。
------解决方案--------------------
我最近也想总结下static,以前总怕别人问static的问题。但有时候总是不打不相识,对它的认识有:

1、一个静态的方法名为main,这就意味着告诉Java编译器,我这个方法不需要创建一个此类的对象即可使用。
2、静态方法

通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法。
3、静态变量

静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间,当然对于final则另当别论了。

4、
别人比较形象的举例:

一个房子,房子里有很多人,房子就是类,人就是对象.
房子里的家具电器什么的都是被那些人公用的就是static,他是类所拥有的东西,如果有人改动了他,他就会被永久改动,比如说一个人损坏了他,别人用的时候他还是损坏的.正因为这样在类创建的时候他就会被先加载进去(所以这会还没有人呢!所以静态方法不能引用对象的东西),然后在创建对象什么的.
而那些非静态的变量和方法就好比是人身上的衣服和人的行为,每个人的都有但是不一定一样.不是公用的是私有的,每个人可以随便改动自己的变量但不会对其他人的变量产生影响.所以说定义静态的就在类里定义就行,何必跑到方法里定义都是公用的嘛!
也可以辩证的理解,方法之间的变量是不能互相调用的,这不和static变量的功能相悖么!
怎么修改,在自己的类里面直接修改就行,在其他类在前面加上类名点变量名就行.

------解决方案--------------------
static不到非要用时基本没怎么用