日期:2014-05-18  浏览次数:20774 次

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

------解决方案--------------------
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));
}
}

------解决方案--------------------
既然你已经知道会有多个线程会去修改这个static变量,你就得对你的方法进行同步(synchronized),这个东西其实就是多线程访问static变量。
------解决方案--------------------
你觉得方法有必要使用static。就实验下呗,这样印象深刻。关于内存溢出的话一般注意下大文件操作,及数据库方面的及时释放等
如果还是经常内存溢出不妨考虑下BEA的Jrockit
------解决方案--------------------
如果你的并发很频繁的话建议还是不要用 Static 的方法,那中只适合于类似 Singleton 模式的简单返回一个对象实例
而不参与数据处理的情况,你要是参与数据处理的话,在并发时会把数据搞的一团糟,要是同步的话恐怕你的网站响应速度会
慢吧,所以最好还是 new 的好,有JVM 的垃圾收集器,内存泄漏你应该不用太担心的。