为什么不能在构造函数中实例化该类的相同对象?

时间:2012-07-06 14:21:34

标签: java constructor

public class Run{
 public static void main(String... args){
      A a1 = new A();
 }
}

class A{
  public A(){
    A a = new A();
  }
  //here as well A a = new A();
}

为什么这会给java.lang.StackOverflowError?在这里发生递归呼叫吗?它是如何发生的?

7 个答案:

答案 0 :(得分:1)

你正在构造函数中调用构造函数 - 这就是new所做的,构造一个新对象。

答案 1 :(得分:1)

  

这里是否发生了递归通话?

  

怎么回事?

当你new A()时,它会调用A的构造函数,它会调用构造函数new A(),它会执行new A() ...等等。这是递归。

答案 2 :(得分:1)

你可以打电话,但这将是一个无限运行的递归调用。这就是你得到StackOverflowError的原因。

以下内容将完美运作:

public class Run{

 static int x = 1;
 public static void main(String... args){
      A a1 = new A();
 }
}

class A{
   public A(){
     if(x==1){
        A a = new A();
        x++;
    }
  }
}

答案 3 :(得分:0)

问题是当你调用构造函数时,你创建了一个新对象(这意味着你再次调用构造函数,所以你创建了另一个对象,所以你再次调用构造函数......)

它是最好的无限递归,它与构造函数无关(实际上你可以从构造函数中创建新对象)。

答案 4 :(得分:0)

基本上没有一个构造函数会退出 - 每个构造函数都会尝试递归地实例化另一个类型为A的对象。

答案 5 :(得分:0)

您需要更改构造函数以实际创建A对象。假设A包含整数值,仅此而已。在这种情况下,您的构造函数应如下所示:

class A{
  int number;
  public A(){
      number = 0;
  }
}

您在代码中所做的事实上是在您自己的构造函数中创建一个新的对象实例。

所以,当你调用new A()时,你正在调用构造函数,然后构造函数在其体内调用new A()。它最终无限地调用自己,这就是你的堆栈溢出的原因。

答案 6 :(得分:0)

我认为那里有一个递归调用。要创建A,您必须在其中创建另一个A.但要在其中创建A,您必须在A内部创建第三个A.依此类推。如果您使用两个不同的构造函数或参数或其他东西,您应该能够解决这个问题:

class A {
    public A(boolean spawn){
        if (spawn) {
            A a = new A(false);
        }
    }
}