如果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:}