public class TestSingle3 {
public static void main(String[] args) {
Single3 s1 = Single3.getInstance();
Single3 s2 = Single3.getInstance();
System.out.println(s1 == s2);
}
}
class Single3{
static Single3 s;
private Single3(){}
static{
s = new Single3();
}
public static Single3 getInstance(){
return s;
}
}
首先,更正一下二楼的说法,静态代码块只是在类加载的时候只会执行一次,而且类的构造函数是私有的,全局只有一个实例对象,所以这就是单例模式的设计思想的简单实现的一种。
所以可以肯定的是,您的这种用法就是单例模式。
其次,单例的复杂一点的用法是考虑到多线程的同步逻辑,而且还区分饿汉和懒汉模式,(区别就是一来就new呢,还是getInstance时没有再new)。
最后,初学Java,建议养成遵循一般Java编码规范的意识,类命令遵循首字母大小而且不应该有数字的原则。**
算啊,因为static(静态变量)属于类,你的Single3类在加载的时候就调用了s = new Single3();代码对s进行了初始化,以后获取到的就是这一个实例。
不是,因为你的static(静态变量)表示你每次使用的时候都重新new了一个,单例的逻辑是:无论你是第多少次使用这个类,所创建的对象始终是你第一次创建的那个。
举个例子:单例就是当你有需求时,是找你老婆解决,而不是花点代价重新new一个女朋友出来!!!
二楼的说法是错误的
这就是单例模式,将构造函数私有 ,静态代码块用于初始化对象,静态代码块只执行一次,所以每次调用getInstance方法都是一个对象,这是单例模式中的恶汉式.
对java不是很了解,如果那块静态代码块只执行一次的话,那么就是单例,如果每次访问该变量的时候都执行,那就不是单例。
在构造代码块中new 的对象,在创建的时候只运行一次。 是单例, 不过应该把创建的那个对象进行private 私有化。
不算,因为那个对象没有private