黑马程序员技术交流社区

标题: 关于单例设计模式跟静态 [打印本页]

作者: 杜天伟    时间: 2012-12-15 22:54
标题: 关于单例设计模式跟静态
本帖最后由 杜天伟 于 2012-12-16 13:28 编辑

关于单例设计模式  
这是代码
class Single
{
        private Single(){}
        private static Single s = new Single();
        public static Single getInstance()
        {
                return s;
        }
}
class SingleDemo
{
        public static void main(String[] args)
        {
                Single ss =Single.getInstance();
        }
}
我疑惑的是,private static Single s = new Single(); 这个是静态函数还是静态变量呢?
还有 这个是随着类的加载(读到Single)就运行建立对象呢,还是在读到.getInstance();时候才建立对象呢?


第二个问题 (跟这个就没关系了),非静态方法是存放在方法区的,它是什么时候存放的呢,是类一加载就跟静态方法一块存到方法区呢还是对象建立的时候存放进去的

作者: 焦健    时间: 2012-12-15 23:45
private static Single s = new Single(); 是本类对象,应该算是静态成员变量,你贴的这个代码的本类对象是随着类的加载就运行建立对象的。
若是在懒汉式的单利假设模式中,对象就是在方法被调用时才对对象进行加载,所以叫做延迟加载。
非静态方法是在对象建立的时候才存放进入方法区的。
作者: 杜天伟    时间: 2012-12-16 00:06
焦健 发表于 2012-12-15 23:45
private static Single s = new Single(); 是本类对象,应该算是静态成员变量,你贴的这个代码的本类对象是 ...

哦了:victory:
作者: Kevin123    时间: 2012-12-16 09:45
本帖最后由 白良锦 于 2012-12-16 09:46 编辑

就楼主的第二个问题,说说:

静态代码块、构造代码块和构造函数的区别
静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次。
构造代码块:用于给对象初始化的。只要建立对象该部分就会被执行,且优先于构造函数。
构造函数:  给对应对象初始化的,建立对象时,选择相应的构造函数初始化对象。
创建对象时,三者被加载执行顺序:静态代码块--->构造代码块--->构造函数
作者: yuchen208    时间: 2012-12-16 15:42
在本类中创建私有静态的变量s (引用类型创建创建对象)
因为是类变量所以运行时加载




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