黑马程序员技术交流社区

标题: 单例设计模式的问题 [打印本页]

作者: 殷婷婷    时间: 2013-6-8 14:37
标题: 单例设计模式的问题
本帖最后由 殷婷婷 于 2013-6-8 16:08 编辑

class Singel
{
private static final Single s=new Single();
private Single()
{
}
public static Single getInstance()
{
return s;
}
在上段饿汉式的代码中,变量s为什么要用static修饰啊?
是因为getInstance是静态方法,所以访问的s也需要是静态的吗?

作者: 张俊生    时间: 2013-6-8 15:12
个人觉得,因为这个类中的构造函数是私有的,没办法在别的类中构建,所有需要静态方法来获取实例,所以getInstance(),要用static来修饰,可直接用类名调用,       即类名.方法名静态方法只能访问静态成员,所以s也需要是静态修饰。
作者: 夏一站    时间: 2013-6-8 15:49
  1. class Single
  2. {
  3. private static Single s=null;
  4. private Single(){}
  5. public static synchronized Single getInstance()
  6. {
  7. if(s==null)
  8. s=new Single();
  9. return s;
  10. }
  11. }
复制代码
Single类进内存,对象还没有存在,只有调用了getInstance()方法时,才建立对象。刚开始时不做,什么时候需要什么时候做。
synchronized是给该方法上锁,当有一个对象操作该方法时,别的对象就不能操作。是为了防止两个对象同时操作该方法。


作者: 黄辉    时间: 2013-6-8 15:51
是的  因为getInstance()方法也是静态的,而静态方法在虚拟机运行时就已经存在于方法区中了,所以它所涉及的访问成员不可能是非静态的,于是S同样必须是静态
作者: 郭天龚    时间: 2013-6-8 15:51
在饿汉式单列设计代码中。是因为getInstance是静态方法,所以s也要被static修饰。但是饿汉式在类加载的时候这个对象也存在于堆内存中了。
作者: 曹宇    时间: 2013-6-8 17:53
是因为getInstance是静态方法,所以访问的s也需要是静态的吗?

可以这样说 是的。

但严格来说 是因为s是静态的 所以 方法才是静态方法


单例设计模式 就是这个s  可以说是个共享对象,
既然是个共享对象  且是final修饰的  何不用static修饰  以便可以直接调用呢。。

一般共享数据 都可以定义成静态的  
直接拿去用 省的用一次 要new一次这个数据所在的类

因为s是静态  获取s的函数就要静态   




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2