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()方法内可以正常得出结果。如果放在//注释位置则会出问题。这是什么原因造成的?谢谢

解决方案 »

  1.   

    无限递归,死循环。
    写成static的就可以了。
      

  2.   

    嗯,如果写在那就不停的创建Temp...然后崩溃
      

  3.   

    extends一个子类的时候经常会出现一些意想不到的问题,这里说一下Java在构造实例时的顺序(不讨论装载类的过程)
    构造的粗略过程如下
    1、分配对象空间,并将对象中成员初始化为0或者空,java不允许用户操纵一个不定值的对象。
    2、执行属性值的显式初始化(这里有一点变化,一会解释,但大体是这样的)
    3、执行构造器
    4、将变量关联到堆中的对象上构造器中一定不要创建自身的实例,否则会造成调用栈溢出错误。这个规则也适用于对象的实例变量,如果对象中有自身的引用,这个引用一定不能在定义中或者构造器中初始化。class a
    {
    a _a = new a();public a()
    {
    _a = new a();
    a _b = new a();
    }
    }以上三种情况都会造成栈溢出,呵呵,这样会造成一个无穷递归的调用栈
      

  4.   

    如果在这里不能得到满意回答,请尝试到IT付费问答社区www.nlld.net提问