黑马程序员技术交流社区
标题:
private Single s =new Single();不设定为static的问题
[打印本页]
作者:
高鑫
时间:
2012-5-3 02:50
标题:
private Single s =new Single();不设定为static的问题
class Single
{ private int num;
public void setNum(int num)
{ this.num=num;
}
public int getNum()
{
return num;
}
Single(){}
private Single s =new Single(); //把static取掉
}
class SingleDemo
{
public static void main (String[]args)
{
Single s1=new Single();
Single s2=new Single();
s1.setNum(30);
System.out.println(s2.getNum());
}
}
复制代码
去掉标注处的static 后,编译可以通过,但是执行后是连续的at Single.<init>(new.java:11),谁能解释下里面到底是怎么运行的?再问下这里取消static后,这个变量s是不是就存到堆内存中了???
作者:
崔仁军
时间:
2012-5-3 08:40
1.你把single设为是私有的属性 就不能用直接new 那不就报错了吗 如果你加上static 的话是在加载虚拟机的时候就会回执行了 所以能通过
作者:
马超
时间:
2012-5-3 08:46
变量名s应该是在 栈内存当中存放的吧?咋能跑到堆内存当中去呢啊?推内存当中存放的是对象和成员属性啊
作者:
袁培育
时间:
2012-5-5 14:00
不加static时会出现你见到的那种情况,原因是内存溢出,因为你single类中有一个private Single s =new Single();当类加载时会执行这个代码,于是在堆内存中建立一个single对象,在建立single对象时又执行了这个代码(因为这个代码在single类中,只要建立single对象就会执行),这是你无意之间搞了个递归,程序会不断建立single对象直到内存溢出才停止。加上static后,s就是共享的了,只需建立一次就行了。
作者:
何阳
时间:
2012-5-6 20:26
class Single
{ private int num;
public void setNum(int num)
{ this.num=num;
}
public int getNum()
{
return num;
}
Single(){}
private Single s =new Single(); //把static取掉
}
class SingleDemo
{
public static void main (String[]args)
{
Single s1=new Single();
Single s2=new Single();
s1.setNum(30);
System.out.println(s2.getNum());
}
}
//这个问题是内存的溢出
//解释原因
//你在主函数中创建对象,那么S1会调用自己的类中的构造函数初始化此对象,初始化S1自己的成员属性
//而 private Single s =new Single(); 属性成员对象,那么他也要初始化,所以会在内存的堆中开辟空间
//因为此时的成员属性也是在初始化对象,那么他会继续调用Singel并初始化它,有在内存中开辟空间
//此时类推,一直在创建对象,但是一直没有完成这个初始化动作,他会一直在堆内存中创建,直到系统给JVM
//分配的空间用完,所以会有以上的错误。
//但是你把那个成员属性加了静态,那么它会在内存的方法去,而不是内存的堆中,他是一个共享的数据,只会有一个对象
//类加载时,他已经完成了初始化的动作了.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2