Java语法中规定,静态方法的访问方式为类名.方法名。
相对于普通方法而言,调用起来更加的方便,那么,我有这样的想法,把所有的方法都改写成静态的,那使用起来不就很方便了嘛,干嘛还要写成普通方法,每次必须new对象才能使用。我这里指的所有方法,主要可以针对于系统里的dao层,即所有的业务逻辑处理的方法,比如各种数据的查询,把所有的这些业务逻辑处理的方法都改成静态的。我觉得这样做应该是不好的,要不然早就这么做了,那么,静态方法是有什么缺陷吗?所以才不能这样做。系统里很多的工具类的方法,一般都写成静态的,不也是为了使用方便吗?
为什么不能把逻辑处理的方法都改成静态的呢?新手求解惑

解决方案 »

  1.   

    静态方法有利有弊,静态方法属于类级别,会一直暂用系统内存,谁都不想内存蹦吧,貌似不能被GC回收,而且在多线程共享环境下存在同步问题(如果你是web程序,多用户session会出问题的)。一般来说如果是工具类,不存在属性级别属性,则方法为静态方法;如果是一般的业务逻辑处理类,有自己的属性,静态类不能访问非静态属性,需要定义普通方法。
      

  2.   

    1.静态方法占用空间2.静态方法一般都定义为public,大家都可以使用。3.你如果写一个方法只自己用定义为private静态,那就无语了
      

  3.   

    静态方法额外占用空间?凭空猜测吧对于类的静态或非静态方法,只要类载入了,占用情况是一样的。非静态方法,不会因为产生了多个实例而存在多份。一般来讲,静态方法里使用的参数,都是与实力无关的,而非静态方法,多半使用了当前实例的变量比如class A {
    int i = 0; static void printClass() {
    System.out.println("I'm Class A~");
    } void printI() {
    System.out.println("i=" + i);
    } static void sPrintI(A a) {
    System.out.println("i=" + a.i);
    } public static void main(String... args) {
    A.printClass();
    A a = new A();
    a.printI();
    A.sPrintI(a);
    }
    }其中 A.printCLass() 执行过程和实例无关。哪怕这个类没有任何实例产生,都可以正确的执行
    而   A a = new A();    a.printI();   这个执行过程,必须依赖于实例才可以理论上来讲,一般的非静态方法都可以写成静态方法,如上面代码中的  printI()和sPrintI(A a)这样对于2个方法,要打印A实例a的变脸i的值,可以执行 a.printI() 或者 A.sPrintI(a)
      

  4.   

    静态方法里面使用的变量大部分是静态的,这些静态变量会占用内存,并不会被GC回收;
    另外定义成static方法跟变量在多线程的时候,需要考虑好里面变量跟方法的同步问题。
    不如每次都是新对象独立操作安全稳定。“我这里指的所有方法,主要可以针对于系统里的dao层”,dao层都是数据库相关的,如果对效率跟准确性要求很高,你写成静态的首先你不能保证方法多线程什么的考虑的很好,查询结果很安全跟稳定,另外效率不高这样,为了并发的安全都要加锁,但是这就限制了效率。所以除非有必要一般不要把方法写成静态的。
      

  5.   


    那么,是不是如果一个方法没有使用类属性,比如仅仅是做一个数据库的操作,是不是就可以写成静态的呢?如果把出现脏数据,那么,仅仅是select 语句的操作方法, 我写成静态的,OK吗?
      

  6.   

    不说什么设计模式动态加载什么的,从最实际的角度来看问题:
    1.static方法在多线程的时候,需要考虑同步问题。增加代码复杂度
    2.“我这里指的所有方法,主要可以针对于系统里的dao层”,dao层都是数据库相关的,对效率跟准确性要求很高,你写成静态的多线程的时候就要考虑是否加锁才能保证数据安全跟正确,这样效率就会很差。
    一般除非有必要,不要声明静态的方法跟变量。
      

  7.   

    3楼说的挺精炼的 静态的问题是大家都可以用 如果你有个学生类Student然后new了两个实例s1,s2如果是静态的 那么他们岂不是会共用属性了 会出问题
      

  8.   

    从你的回复来看,你可能不太理解NIO机制,NIO是支持长连接的;主要原理是基于事件机制,采用非阻塞技术;所以不会因为read或write导致线程因为需要等待数据而阻塞。你可以用一个线程负责10个用户的数据接收,负责另外10个用户的数据发送。当然也可以用一个线程同时负责5个用户的数据接收和发送。
    另外也请你放心的是,NIO并非Java原创,它早就广泛应用于各种操作系统。
    大并发系统基本上没有不采用非阻塞IO机制的。
      

  9.   

    你好像没了解静态方法的含义,静态方法的含义是:方法中不调用对象的特殊属性,如果调用了特殊的属性,那这个方法就不能用Static修饰,特殊属性比如说人的名字,这个每个人都不同,需要构造函数进行初始化,如果类中的某个方法要用的名字name那么这个方法修饰符就不能加Static
      

  10.   

    静态方法的优缺点楼上都说了,我就没必要纠结了,你是定义没搞清楚,JDK中确实有很多静态的那是因为他们不需要调用一些特殊属性,自己直接赋值进去而不需要用到方法所在类中的特有数据,所以用静态修饰,static修饰的都是共享成员,这些成员跟对象没有关系,优先于对象存在,变量可以说创建类的时候这些静态成员就已经在内存开辟空间,不需要通过创建对象再在堆里面开辟空间,静态方法只能调用静态(对象共享的数据),一句话:静态修饰的能够独立存在不依赖对象