Java 在它自己的类中的对象

Java 在它自己的类中的对象,java,object,Java,Object,那么让我们说: public class Sample { //main() class public static void main(String[] args) { A a = new A(); } } public class A { A aa = new A(); } 所以…当我运行它时…它给出:java.lang.StackOverflowerr。 所以,我的解释是,对象a在第1行生成,在第2行进一步创建对象aa生成,然后进入递归。。。。它不断创

那么让我们说:

public class Sample {  //main() class
    public static void main(String[] args) {
      A a = new A();
    }
}

public class A {
  A aa = new A();
}
  • 所以…当我运行它时…它给出:java.lang.StackOverflowerr。 所以,我的解释是,对象
    a
    在第1行生成,在第2行进一步创建对象
    aa
    生成,然后进入递归。。。。它不断创建一个又一个对象,直到堆内存满为止

  • 如果对象是在堆上创建的…那么为什么它会说StackOverflowerError


  • 堆栈溢出的原因很简单,就是堆栈在(小)As填满堆之前耗尽了空间


    您已经正确地识别了递归。所以

    堆栈溢出的原因很简单,就是堆栈在(小)As填满堆之前耗尽了空间


    您已经正确地识别了递归。所以

    嗯,它同时使用堆和堆栈。堆栈空间是因为您递归地位于
    A
    的构造函数中。如果将初始化放在构造函数的主体中,则更容易看到这一点:

    public class A {
      A aa;
    
      public A() {
         aa = new A();
      }
    }
    

    因此,
    A
    构造函数调用自身,然后调用自身,等等。通常堆空间比堆栈空间要多,因此首先要耗尽堆栈空间。如果你的类有很多字段,你可能会首先耗尽堆空间——尽管在现代机器中堆通常相当大。

    好吧,它同时使用堆和堆栈。堆栈空间是因为您递归地位于
    A
    的构造函数中。如果将初始化放在构造函数的主体中,则更容易看到这一点:

    public class A {
      A aa;
    
      public A() {
         aa = new A();
      }
    }
    

    因此,
    A
    构造函数调用自身,然后调用自身,等等。通常堆空间比堆栈空间要多,因此首先要耗尽堆栈空间。如果你的类有很多字段,你可能会首先耗尽堆空间——尽管在现代机器中堆通常相当大。

    如果你将堆栈设置得足够大,堆设置得足够小,那么当你耗尽堆空间时就会产生错误。构造函数是一种方法。每个构造函数调用占用堆栈上的空间。对象在堆上创建,但对这些对象的引用在堆栈上创建。More objects=More references=stack overflow如果将堆栈设置得足够大,堆设置得足够小,那么当堆空间用完时,它将生成错误。构造函数是一种方法。每个构造函数调用占用堆栈上的空间。对象在堆上创建,但对这些对象的引用在堆栈上创建。更多对象=更多引用=堆栈溢出