yingying 发表于 2012-11-27 10:01
Demo d = new Demo();这句代码应该在构造函数中吧,不然都不会执行,怎么会溢出呢?你静态的东西在内存 ...
我理解错了????其实 Demo d = new Demo()这句话是在 构造函数里面》?也就是说其实代码还原就应该是这样:class Demo
{
Demo()
{
Demo d = new Demo();
}
}
class DemoDemo
{
public static void main(String[] args)
{
System.out.println(new Demo());
}
}正确理解上面代码会无限循环,应该是这样理解对吗??但是还是不明白静态修饰后就不会循环了,你说只开辟一片空间,就不开辟了,能不能帮忙画个图说明下,谢谢了!!作者: 张学永 时间: 2012-11-27 11:01
张权 发表于 2012-11-27 10:53
我理解错了????其实 Demo d = new Demo()这句话是在 构造函数里面》?也就是说其实代码还原就应该 ...
Demo d = new Demo(),不加静态修饰的话,放在成员位置,和放在构造函数里面,效果都会造成内存溢出。
因为它们都在初始化的时候,进行了赋值操作,就是去new 对象了,然后被new的这个对象又有这么个属性,接着去new对象,肯定就循环了啊。
加了静态以后,可以放在成员位置上,但是不可以放在构造函数里。加静态放在成员位置上,只要类加载就产生这么个成员对象,并且被所有对象共享,以后再new的对象都不会再执行静态代码。就不会死循环了。
个人这么理解的。作者: 张权 时间: 2012-11-27 11:20
张学永 发表于 2012-11-27 11:01
Demo d = new Demo(),不加静态修饰的话,放在成员位置,和放在构造函数里面,效果都会造成内存溢出。
因 ...
我刚想了一下,不知道这样理解对不对, 首先主函数 创建对像 Demo d = new Demo(),然后这个对像有一个被静态修饰属性d,然后这个静态变量d 有一个显示初始化值 new Demo(),按说它是会继续new 下去的,但是因为 d是静态变量,如果再去new,类就会再去加载一次,而类已经加载了,不会在加载了!!