黑马程序员技术交流社区

标题: 单例模式 异常 [打印本页]

作者: Dej@vu    时间: 2013-8-11 09:43
标题: 单例模式 异常
  1. class Single   
  2. {  
  3.     private Single(){}  
  4.     private static Single s = new Single();  
  5.     public static  Single getSingle()  
  6.     {  
  7.         return s;  
  8.     }  
  9. }  
复制代码
如果private static Single s = new Single();
这段代码如果不用静态private Single s = new Single();
当调用是为什么会出现内存溢出异常啊??
作者: longlangcx    时间: 2013-8-11 10:17
不用static相当于一个Single对象中,组合了另一个Single对象,这个成员Single对象又组合了另一个成员Single对象,而这另一个成员Single对象还组合一个Single对象..........
类似于递归吧。所以你这个类一旦初始化会无限开辟内存空间创建对象,最终自然就会内存溢出了。
作者: 神之梦    时间: 2013-8-11 14:41
这样也内存溢出,还真没试过
作者: 天涯海角    时间: 2013-8-11 21:02
class Single   
{  
    private Single(){}  
    private static Single s = new Single();  
    public static  Single getSingle()  
    {  
        return s;  
    }  
}  
class SingleDemo{
        public static void main(String[] args)
        {
             single ss=Single.getInstance();//如果Single s = new Single();不是静态的,当多个像ss的类变量=Single.getInstance()时就会在堆内存
中开辟空间,就会出现内存溢出
        }
作者: 封号了...    时间: 2013-8-11 22:18
大哥,我试了一下,不存在你说的这个异常,因为如果:
private Single  s  = new String();//去掉static
那么
    public static  Single getSingle()  
    {  
        return s;  
    }  
中的static也必须去掉,因为静态不能调用非静态,除非static Single s = new String();在同一句代码中将一个对象赋给静态的。
如果public static Single getSingle(){return s;}中去掉static,那么这就不是静态方法,就不能用Single.getSingle();调用了,而构造器又私有了,不能在其他类中new了此类对象了。
都运行不了,除非你调用了反射调用!
不过,你应该是自己在这个类中加了个main方法,然后自己new自己的对象.getSlngle();的。
其实这一题的关键问题是怎么无限循环的:是因为private Single s = new Single(); //Single是成员变量,
虚拟机每次加载的时候会给其自动初始化的,也就是每次调用此类的时候他都会自动new一个新对象,
在new新对象的时候又会自动运行这段代码new出第3个对象,然后无限循环下去。
说的有些乱{:soso_e127:}




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