单例模式的对象是在什么时候创建的??

路上走着 2014-04-07 02:48:15
在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()都创建了一个对象,而且这种私有构造方法是怎么保证只能创建一个对象的呢?
求解答!!
...全文
691 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Magical茏 2014-04-16
  • 打赏
  • 举报
回复
引用 8 楼 zengchen73 的回复:
[quote=引用 3 楼 wlwlwlwl015 的回复:] 是在Singleton.getInstance()这样调用的时候吗?那么岂不是每次使用Singleton.getInstance()都创建了一个对象 类只会初始化一次,所以每次调用静态方法得到的都是同一个对象,这就是单例。
类是什么时候初始化的呢,一个类的初始化和使用new来实例化这个类有什么关系呢?[/quote] 在new一个类时,会调用它的构造函数,此时这个对象的成员变量就会被初始化;
Z-ero 2014-04-16
  • 打赏
  • 举报
回复
引用 7 楼 zengchen73 的回复:
[quote=引用 2 楼 u014547383 的回复:] 这个代码就是在本类中创建了一个对象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都是同时持有一个对象吗[/quote] 这个时候obj1和obj2持有的都是instance所持有的对象
Magical茏 2014-04-16
  • 打赏
  • 举报
回复
引用 7 楼 zengchen73 的回复:
[quote=引用 2 楼 u014547383 的回复:] 这个代码就是在本类中创建了一个对象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都是同时持有一个对象吗[/quote] 是的, 由于是静态方法,所以只创建一次Singleton; obj1和obj2存储在栈里,指向堆中的Singleton实例; instance存储在data seg里,也指向堆中的Singleton实例; 代码:
private static final Singleton instance = new Singleton();
路上走着 2014-04-15
  • 打赏
  • 举报
回复
引用 3 楼 wlwlwlwl015 的回复:
是在Singleton.getInstance()这样调用的时候吗?那么岂不是每次使用Singleton.getInstance()都创建了一个对象 类只会初始化一次,所以每次调用静态方法得到的都是同一个对象,这就是单例。
类是什么时候初始化的呢,一个类的初始化和使用new来实例化这个类有什么关系呢?
路上走着 2014-04-15
  • 打赏
  • 举报
回复
引用 2 楼 u014547383 的回复:
这个代码就是在本类中创建了一个对象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都是同时持有一个对象吗
fdming1 2014-04-10
  • 打赏
  • 举报
回复
你没办法直接使用他的构造函数,所以不会创建新的对象。
kky2010_110 2014-04-10
  • 打赏
  • 举报
回复
引用 4 楼 kky2010_110 的回复:
final 只初始化一次
还有你不明白是因为你写错了
kky2010_110 2014-04-10
  • 打赏
  • 举报
回复
final 只初始化一次
小灯光环 版主 2014-04-08
  • 打赏
  • 举报
回复
而且这种私有构造方法是怎么保证只能创建一个对象的呢? 首先回答这个问题,说白了,定义私有的构造方法就是为了防止new对象,new一个对象会在内存为其分配地址等等,所以说每次new的都是新对象,每个新new的对象都是不相同的。 单例模式只能创建一个对象,我看不出这个对象是什么时候创建的。 通过调用这个类的静态方法,返回instance变量,而instance变量在类初始化的时候就被赋值new Singleton(),所以是在类初始化的时候创建的对象。 是在Singleton.getInstance()这样调用的时候吗?那么岂不是每次使用Singleton.getInstance()都创建了一个对象 类只会初始化一次,所以每次调用静态方法得到的都是同一个对象,这就是单例。
Z-ero 2014-04-07
  • 打赏
  • 举报
回复
看来你还不太明白构造函数的作用,也不太明白对象是怎么创建的,先记着使用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();
_serendipity_ 2014-04-07
  • 打赏
  • 举报
回复
如果是Web应用,都不用管这些了。直接在前面加个@Singleton标注,丢给Java EE容器去管理就行了。要用的时候@Inject注入进来。对于Web应用,这是比较好的方式。

50,639

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧