日期:2014-05-20  浏览次数:20726 次

单例模式的对象是在什么时候创建的??
在Java中,单例模式的使用方法是
public class Singleton {

  private Singleton() {
 }

  private final Singleton instance = new Singleton();
 
  public static  Singleton getInstance() {
    return instance;
  }
}


而使用的时候是
Singleton obj = Singleton.getInstance();


单例模式只能创建一个对象,我看不出这个对象是什么时候创建的。是在Singleton.getInstance()这样调用的时候吗?那么岂不是每次使用Singleton.getInstance()都创建了一个对象,而且这种私有构造方法是怎么保证只能创建一个对象的呢?
求解答!!
------解决方案--------------------
如果是Web应用,都不用管这些了。直接在前面加个@Singleton标注,丢给Java EE容器去管理就行了。要用的时候@Inject注入进来。对于Web应用,这是比较好的方式。
------解决方案--------------------
看来你还不太明白构造函数的作用,也不太明白对象是怎么创建的,先记着使用new关键字了的话就是创建了一个对象吧。构造函数是在创建对象的时候随对象的加载而加载的,用来给对象进行初始化,如果所有构造函数都被private了,就不能在其他的类访问到,也就不能在其他的类中创建对象了(平时没自定义构造函数是因为系统默认添加了一个空参数的构造函数,所以也可以创建对象),而只能在本类中创建对象。

private final Singleton instance = new Singleton();
 
  public static  Singleton getInstance() {
    return instance;
  }

这个代码就是在本类中创建了一个对象new Singleton()然后把这个对象的引用(就是对象在堆内存中的地址值)给了instance,
然后再通过getInstance()这个方法把instance持有的引用给了调用此方法的人,也就是obj(注意这个变量名是Singleton类类型的),obj只是和instance同时持有了new Singleton()这个对象的引用,而不是obj也创建了一个对象。

Singleton obj = Singleton.getInstance();

------解决方案--------------------
而且这种私有构造方法是怎么保证只能创建一个对象的呢?
首先回答这个问题,说白了,定义私有的构造方法就是为了防止new对象,new一个对象会在内存为其分配地址等等,所以说每次new的都是新对象,每个新new的对象都是不相同的。

单例模式只能创建一个对象,我看不出这个对象是什么时候创建的。
通过调用这个类的静态方法,返回instance变量,而instance变量在类初始化的时候就被赋值new Singleton(),所以是在类初始化的时候创建的对象。

是在Singleton.getInstance()这样调用的时候吗?那么岂不是每次使用Singleton.getInstance()都创建了一个对象
类只会初始化一次,所以每次调用静态方法得到的都是同一个对象,这就是单例。
------解决方案--------------------
final 只初始化一次
------解决方案--------------------
引用:
final 只初始化一次

还有你不明白是因为你写错了
------解决方案--------------------
你没办法直接使用他的构造函数,所以不会创建新的对象。
------解决方案--------------------
引用:
Quote: 引用:

这个代码就是在本类中创建了一个对象new Singleton()然后把这个对象的引用(就是对象在堆内存中的地址值)给了instance,
然后再通过getInstance()这个方法把instance持有的引用给了调用此方法的人,也就是obj(注意这个变量名是Singleton类类型的),obj只是和instance同时持有了new Singleton()这个对象的引用,而不是obj也创建了一个对象。

Singleton obj = Singleton.getInstance();

就是说如果有

Singleton obj1 = Singleton.getInstance();
Singleton obj 2= Singleton.getInstance();

那么实际上obj1,obj2和instance都是同时持有一个对象吗

是的,
由于是静态方法,所以只创建一次Singleton;
obj1和obj2存储在栈里,指向堆中的Singleton实例;
instance存储在data seg里,也指向堆中的Singleton实例;
代码:
private static final Singleton instance = new Singleton();

------解决方案--------------------
引用:
Quote: 引用:

这个代码就是在本类中创建了一个对象new Singleton()然后把这个对象的引用(就是对象在堆内存中的地址值)给了instance,
然后再通过getInstance()这个方法把instance持有的引用给了调用此方法的人,也就是obj(注意这个变量名是Singleton类类型的),obj只是和instance同时持有了new Singleton()这个对象的引用,而不是obj也创建了一个对象。

Singleton obj = Singleton.getInstance();

就是说如果有

Singleton obj1 = Singleton.getInstance();
Singleton obj 2= Singleton.getInstance();

那么实际上obj1,obj2和instance都是同时持有一个对象吗

这个时候obj1和obj2持有的都是instance所持有的对象
------解决方案--------------------
引用:
Quote: 引用:



是在Singleton.getInstance()这样调用的时候吗?那么岂不是每次使用Singleton.getInstance()都创建了一个对象
类只会初始化一次,所以每次调用静态方法得到的都是同一个对象,这就是单例。


类是什么时候初始化的呢,一个类的初始化和使用new来实例化这个类有什么关系呢?

在new一个类时,会调用它的构造函数,此时这个对象的成员变量就会被初始化;