张学永 发表于 2012-11-27 11:01
Demo d = new Demo(),不加静态修饰的话,放在成员位置,和放在构造函数里面,效果都会造成内存溢出。
因 ...
我刚想了一下,不知道这样理解对不对, 首先主函数 创建对像 Demo d = new Demo(),然后这个对像有一个被静态修饰属性d,然后这个静态变量d 有一个显示初始化值 new Demo(),按说它是会继续new 下去的,但是因为 d是静态变量,如果再去new,类就会再去加载一次,而类已经加载了,不会在加载了!!
张权 发表于 2012-11-27 10:53
我理解错了????其实 Demo d = new Demo()这句话是在 构造函数里面》?也就是说其实代码还原就应该 ...
Demo d = new Demo(),不加静态修饰的话,放在成员位置,和放在构造函数里面,效果都会造成内存溢出。
因为它们都在初始化的时候,进行了赋值操作,就是去new 对象了,然后被new的这个对象又有这么个属性,接着去new对象,肯定就循环了啊。
加了静态以后,可以放在成员位置上,但是不可以放在构造函数里。加静态放在成员位置上,只要类加载就产生这么个成员对象,并且被所有对象共享,以后再new的对象都不会再执行静态代码。就不会死循环了。
个人这么理解的。
Demo d = new Demo();这句代码应该在构造函数中吧,不然都不会执行,怎么会溢出呢?你静态的东西在内存中是共享的,只需要加载一次就在不加载了,也就是不会出现你上面的那种循环;一般在构造函数中new对象都会因为递归导致内存溢出的。只要你在主函数中new Demo()一次,然后就会在 Demo类中递归创建对象,直到内存溢出!