//接口X
interface X
{
public void run();
}
//实现接口X的一个类
class I implements X
{
X x;
public I()
{
this.x=new I();  //Exception in thread "main" java.lang.StackOverflowError
}
public I(X x)
{
this.x=x;
}
public void start()
{
x.run();
}
public void run()
{

}
}
//实现接口X的一个类
class A implements X
{
public void run() 
{
System.out.println("A");
}
}
//继承类I的类
class B extends I  
{
public void run()
{
System.out.println("B");
}
}public class Q
{
public static void main(String[] args)
{
new I(new A()).start();
new B().start();
}
}
为什么this.x=x;这句没有出错而this.x=new I(); 出错了?
java.lang.StackOverflowError是什么错误?
线程Thread类的构造函数Thread()和Thread(Runnable target)内部是怎么写的(想象)

解决方案 »

  1.   


    public I() 

      this.x=new I(); //Exception in thread "main" java.lang.StackOverflowError 

    出现这个错误是因为你在构造方法中构造自己.....执行到这里会出现递归构造,最后stack益出.....
      

  2.   

    new I()代码执行到这里,就会调用I类的构造方法public I(),但是楼主在I类的构造方法public I()中又写上了new I();一旦I类创建对象,这个对象就会无限的把自己new下去...所以这里抛出了异常
      

  3.   

    栈溢出了,JVM依然是采用栈式的虚拟机,这个和C和Pascal都是一样的。函数的调用过程都体现在堆栈和退栈上了。你调用构造函数的“层”太多了,以致于把栈区溢出了。通常来讲,一般栈区远远小于堆区的,因为函数调用过程往往不会多于上千层,而即便每个函数调用需要1K的空间(这个大约相当于在一个C函数内声明了256个int类型的变量),那么栈区也不过是需要1MB的空间。通常栈的大小是1-2MB的。通常递归也不要递归的层次过多,很容易溢出。
      

  4.   

    X x=new I();
    public I()
    { }
    这样也会出像问题是为什么呢?
      

  5.   

    因为对象的创建入口是 构造函数,  构造函数会递规地"初始化"构造函数中声明的对象, 所以出现了其递规地调用自己的情况,, 直到耗尽stack.