[英]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();
}
所以...当我运行它时...给出了:java.lang.StackOverflowError。 所以,我的解释是,对象a
在1号线代,进一步加强将创建对象aa
代第2行...然后进入一个递归....它不断创建对象之后的对象,直到堆内存已满。
如果对象是在堆上创建的...那么为什么会说StackOverflowError?
好吧,它同时使用了堆和栈。 堆栈空间是因为您递归地位于A
的构造函数中。 如果将初始化放在构造函数的主体中,则将更容易看到以下内容:
public class A {
A aa;
public A() {
aa = new A();
}
}
因此, A
构造函数先调用自身,然后调用自身,依此类推。通常,可用的堆空间比堆栈空间要多,因此为什么您首先要耗尽堆栈空间。 如果您的类有很多字段,则可以想象首先会用完堆空间-尽管通常在现代计算机中堆非常大。
堆栈溢出的原因很简单,就是在(小)As可以填满堆之前,堆空间不足。
您已经正确识别了递归。 所以!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.