像各位大哥请教,我在做个网站,后台有很多类,请问方法可以用static来标示么?(如果可以,同时有很多线程在启用,是不是只维持一个实例,维持一个变量。希望解释的详细点。)要是不可以,每次调用方法都得new一下对象,怎么样控制资源,不让内存泄漏?

解决方案 »

  1.   

    Static关键字
    static关键字用来声明成员属于类,而不是属于类的对象。
    1. static (类)变量
    类变量可以被类的所有对象共享,以便与不共享的成员变量区分开来。
    2. static (类)方法
    静态方法可以通过类名直接调用该方法,而不用通过对象调用。
    例如:
    class PersonCount {
    private int personID; private static int num = 0; public PersonCount() {
    num++;
    personID = num;
    } public static String getPersonDes() {
    return "this is a policeman";
    }
    }class TestPersonCount {
    public static void main(String[] args) {
    // 直接用类名来访问该静态方法,而不需要该类的对象
    String s = PersonCount.getPersonDes();
    System.out.println(s);
    }
    }main()是静态的,因为它必须在任何实例化发生前被顺序地访问,以便应用程序的运行。
    静态方法不能被覆盖成非静态。同样,非静态方法也不能被覆盖成静态方法。

    3 "独身"设计模式
    独身设计模式,也就是说一个类只产生一个对象。那么怎么才能做到这一点呢??我们知道构造器是用来构造对象的。首先要对构造器入手。既然只产生一个对象,那么我们就干脆先一刀砍断,把构造器的访问权限定义成私有,不能在类的外面再构造该类的对象。也就是说只能在类的里面调用该类的构造器来产生对象。那么在该类里应该定义一个静态的属性,并初始化该类的一个对象。(原因是静态的东西只执行一次,也就是说该属性只初始化一次。那么每次得到的应该是同一个实例)
    class TestSC {
    public static void main(String[] args) {
    SingleClass sc1 = SingleClass.sc;
    SingleClass sc2 = SingleClass.sc;
    sc1.test();
    sc2.test();
    }
    }class SingleClass {
    int i = 0; static SingleClass sc = new SingleClass(); private SingleClass() {
    } public void test() {
    System.out.println("hello " + (++i));
    }
    }运行的结果为:
    hello 1
    hello 2
    说明是同一个实例。
    在类的设计的时候,我们也应该遵守封装的要求。把属性定义成私有的。再定义一个共有的方法来去到该属性的值。
    改后的代码:
    class TestSC {
    public static void main(String[] args) {
    SingleClass sc1 = SingleClass.getSingleClass();
    SingleClass sc2 = SingleClass.getSingleClass();
    sc1.test();
    sc2.test();
    }
    }class SingleClass {
    int i = 0; private static SingleClass sc = new SingleClass(); private SingleClass() {
    } /*
     * 因为在类的外面不能来构造给类的实例了, 所有该方法定义成静态的,通过类名直接可以调用。
     */
    public static SingleClass getSingleClass() {
    return sc;
    } public void test() {
    System.out.println("hello " + (++i));
    }
    }
      

  2.   

    我是想问,如果把方法设成static,会不会多个线程同时访问这个方法是,后一个的修改会改变前一个的值。就是static 方法多个线程同时调用,塔是怎么来处理这种并发的??
      

  3.   

    既然你已经知道会有多个线程会去修改这个static变量,你就得对你的方法进行同步(synchronized),这个东西其实就是多线程访问static变量。
      

  4.   

    你觉得方法有必要使用static。就实验下呗,这样印象深刻。关于内存溢出的话一般注意下大文件操作,及数据库方面的及时释放等
    如果还是经常内存溢出不妨考虑下BEA的Jrockit
      

  5.   

    如果你的并发很频繁的话建议还是不要用 Static 的方法,那中只适合于类似 Singleton 模式的简单返回一个对象实例
    而不参与数据处理的情况,你要是参与数据处理的话,在并发时会把数据搞的一团糟,要是同步的话恐怕你的网站响应速度会
    慢吧,所以最好还是 new 的好,有JVM 的垃圾收集器,内存泄漏你应该不用太担心的。