繁体   English   中英

自己类中的对象

[英]An object inside its own class

所以说:

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

public class A {
  A aa = new A();
}
  1. 所以...当我运行它时...给出了:java.lang.StackOverflowError。 所以,我的解释是,对象a在1号线代,进一步加强将创建对象aa代第2行...然后进入一个递归....它不断创建对象之后的对象,直到堆内存已满。

  2. 如果对象是在堆上创建的...那么为什么会说StackOverflowError?

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

public class A {
  A aa;

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

因此, A构造函数先调用自身,然后调用自身,依此类推。通常,可用的堆空间比堆栈空间要多,因此为什么您首先要耗尽堆栈空间。 如果您的类有很多字段,则可以想象首先会用完堆空间-尽管通常在现代计算机中堆非常大。

堆栈溢出的原因很简单,就是在(小)As可以填满堆之前,堆空间不足。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM