日期:2014-05-20  浏览次数:20726 次

关于构造方法
class   Nerbo
{
void   nbo()
{
System.out.println( "hehe ");
}
}

public   class   Temp   extends   Nerbo
{
//Temp   exa   =new   Temp();
void   tmp()
{
Temp   exa   =new   Temp();
exa.nbo();
}

public   static   void   main(String   []agrs)
{
Temp   tmpMain   =new   Temp();
tmpMain.tmp();
}
}

Temp   exa   =new   Temp();放在tmp()方法内可以正常得出结果。如果放在//注释位置则会出问题。这是什么原因造成的?谢谢

------解决方案--------------------
无限递归,死循环。
写成static的就可以了。
------解决方案--------------------
嗯,如果写在那就不停的创建Temp...然后崩溃
------解决方案--------------------

------解决方案--------------------
死循环
------解决方案--------------------
extends一个子类的时候经常会出现一些意想不到的问题,这里说一下Java在构造实例时的顺序(不讨论装载类的过程)
构造的粗略过程如下
1、分配对象空间,并将对象中成员初始化为0或者空,java不允许用户操纵一个不定值的对象。
2、执行属性值的显式初始化(这里有一点变化,一会解释,但大体是这样的)
3、执行构造器
4、将变量关联到堆中的对象上

构造器中一定不要创建自身的实例,否则会造成调用栈溢出错误。这个规则也适用于对象的实例变量,如果对象中有自身的引用,这个引用一定不能在定义中或者构造器中初始化。

class a
{
a _a = new a();

public a()
{
_a = new a();
a _b = new a();
}
}

以上三种情况都会造成栈溢出,呵呵,这样会造成一个无穷递归的调用栈


------解决方案--------------------
如果在这里不能得到满意回答,请尝试到IT付费问答社区www.nlld.net提问
------解决方案--------------------
普通的成员变量 每次创建类的时候都会创建