何时用静态方法,何时用实例方法(大家分享与讨论,java语言)因为最近公司评审代码,有一大哥老是喜欢指着代码来句:“其实你这里应该改为静态的,你有没有想过,你说说你这里你为什么没有使用静态方法,这里你为什么没有把这个移到方法外面当着静态变量,你知道这样要消耗多少资源吗(确实是我真的不知道呢)”。然后仔细想来确实改为静态方法也没有错,但是好多地方我觉得从oo思想上或者是因为我习惯性思考就用了实例方法,确实没有考虑改为静态方法效率会有多少提高,也不知道怎么计算出浪费的效率,纠结。另外我觉得我好像很懒的考虑什么效率,似乎排斥使用静态方法,晕

解决方案 »

  1.   

    楼主请看这个:http://www.cnblogs.com/dudu837/archive/0001/01/01/1455138.html
      

  2.   

    使用对象实例,是因为我们追求所编写的代码跟OOAD结果完全一致,编写代码就想写畅销小说一样成文自明。如果那种“分析时一套、编码时另一套”,那么就会动不动就写静态方法了。如果一个人根本不承认面向对象分析和设计的知识原则,实际上你去跟他谈对象也是无济于事的,它只会纠缠于“要不要额外花时间去new、内存是怎么布局的”之类的东西。 
      

  3.   

    Mark 学习,这确实是个问题,,,
      

  4.   

    xue习中, 我也是会经常弄不清楚,看看一楼的博客后有点明白了。
      

  5.   

    经验定吧  这个不是很好说
    static是属于类得,是大家共享的
    非static是属于某个实例对象 ,对象人手一份,每份互不干扰的
      

  6.   

    有一大哥老是喜欢指着代码来句:“其实你这里应该改为静态的,你有没有想过,你说说你这里你为什么没有使用静态方法,这里你为什么没有把这个移到方法外面当着静态变量,你知道这样要消耗多少资源吗(确实是我真的不知道呢)”
    真有那么消耗资源么?effective java上说,慎用优化,某些情况下根本不需要做特别的优化。
      

  7.   

    一般情况下,如果是工具类,就是用静态方法,因为不需要new就可以调用,方便。
    深一点来说,如果一个类没有成员变量,那就考虑里面的方法是否需要变成静态。
    类为什么要实例化是因为只有成员变量所占的内存地址不一样,也就展现了类不同的形态。
    你可以看看java源码
    举个例子 Collections 类
    里面似乎都是静态变量
    比如sort方法为什么要定义成静态的?---因为我就是要帮别的类实例处理排序问题的!
    自身不需要成员变量,用谁都一样!或者说它的调用和它自身成员变量无关,那还不是用谁都一样?我就静态好了,调用方便,不用new,少占内存!
    你老大哥基本说的是对的。
      

  8.   

    静态方法是面向过程程序的遗留产物,在面向对象程序中应尽可能少地出现,除了一些 Util 之类的方法之外,不应该使用静态方法。静态方法的优点也就不说了,看一下静态方法的缺点:1:无法通过子类重写其方法体的实现,不利于子类对其的扩展
    2:不可以使用动态代理,无法使用 AOP 对其进行增强处理。比如:某些 DAO 使用了静态方法,那么就不可能对其进行切面式的事务控制。因为增强代理类是原生类的子类,通过对父类方法进行切面增强。由于静态方法不具有这一特性,所以静态方法是无法使用动态代理、AOP 的。可以看一下 Java 类库源代码,或者 Spring、Struts 等一些开源框架,除了 Util 工具类之外,基本上看不到静态方法的踪迹。
      

  9.   

    呵呵,不要把 new 想象成为一种很消耗系统资源的操作,实际上这个操作的速度是非常快的。由于 Hotspot 的原因,JVM 产生对象时其在堆上进行内存分配所消耗的时间可以直接忽略掉。
      

  10.   

    理论上应该尽量少用static来声明变量如果一个应用程序到处都是static变量,不是程序员有问题就是设计/架构有问题!
    个人观点,仅供参考