请教关于static 方法和单例模式问题
一个单例模式代码:
public class SingletonTest
{
public static void main(String[] args)
{
Singleton singleton = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton == singleton2);
}
}
class Singleton
{
private static Singleton singleton = new Singleton();
private Singleton()
{
}
public static Singleton getInstance()
{
return singleton;
}
}
singleton 和singleton2相同,是同一个对象,为什么呢?主要就是private static Singleton singleton = new Singleton();
这一句,加了static是不是说new Singleton()只执行一次,第一次Singleton singleton = Singleton.getInstance();时加载Singleton,初始化Singleton属性,第二次
Singleton singleton2 = Singleton.getInstance();时,因为内存中有singleton属性,就不new Singleton(),直接返回原singleton呢???
请大侠给解释解释,谢谢
这里使用的是饿汉式单例,对于private static Singleton singleton = new Singleton();有解释说jvm保证singleton只被初始化一次,这是一个什么机制????
是不是可以这样理解啊,对于
private static Singleton singleton = new Singleton();
可以看成这样:
private satic Singleton singleton;
static {singleton = new Singleton(); }
因为静态块只在类加载的时候执行一次,所以不管调用多少次,private static Singleton singleton = new Singleton();只执行一次,所以也就只有一个对象了。
请问以上理解是否正确?????
------解决方案--------------------理解不正确啊。
如果一个成员被声明为static,它是指能直接用类名点出成员名,而不必实例化对象,被static修饰的成员是类的所有实例共有的。
单例模式之所以是单例的原因是因为构造方法是私有的,你无法通过new来实例化一个Singleton的对象,而只能通过get方法来获得实例对象。
所以你两次获得的single对象是同一个。
------解决方案--------------------
------解决方案--------------------类的静态属性是在类加载的时候建立的。你后边2次调用getInstance之是吧之前建立的属性对象的引用赋值给你建立的引用对象。
单例模式看名字就知道,单一的实例,也就是一个类只能被实例化一次。当然这里不是说我们建立的类只能被实例化一次,而是通过某种方法使程序中获取的所有该类的对象都为同一个对象,当然最好是只能被实例化一次,比如像楼主类似的写法 一个私有构造函数,一个私有的类成员变量,同个一个方法获得这个类成员变量对象,其他也很多种实现方式。
------解决方案--------------------