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();
}
a
在第1行生成,在第2行进一步创建对象aa
生成,然后进入递归。。。。它不断创建一个又一个对象,直到堆内存满为止堆栈溢出的原因很简单,就是堆栈在(小)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如果将堆栈设置得足够大,堆设置得足够小,那么当堆空间用完时,它将生成错误。构造函数是一种方法。每个构造函数调用占用堆栈上的空间。对象在堆上创建,但对这些对象的引用在堆栈上创建。更多对象=更多引用=堆栈溢出