A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Dej@vu 中级黑马   /  2013-8-11 09:43  /  1299 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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();
当调用是为什么会出现内存溢出异常啊??

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 淡定

查看全部评分

4 个回复

倒序浏览
不用static相当于一个Single对象中,组合了另一个Single对象,这个成员Single对象又组合了另一个成员Single对象,而这另一个成员Single对象还组合一个Single对象..........
类似于递归吧。所以你这个类一旦初始化会无限开辟内存空间创建对象,最终自然就会内存溢出了。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这样也内存溢出,还真没试过
回复 使用道具 举报
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()时就会在堆内存
中开辟空间,就会出现内存溢出
        }
回复 使用道具 举报
大哥,我试了一下,不存在你说的这个异常,因为如果:
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:}
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马