实例变量在堆栈上,对象在堆上,对象引用在堆栈上。对?但是,如果实例变量是对象的引用呢?像var c:
class clony implements Cloneable {
clony c = new clony();
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class tst2 {
public static void main(String[] args) throws CloneNotSupportedException {
clony j1 = new clony();
}
}
如果它继续堆,为什么它会抛出并堆栈溢出错误?
答案 0 :(得分:2)
您的参考c
是班级clony
的字段。这意味着引用将存储在为clony
对象分配的内存区域内的堆上。
并且您的程序抛出了一个堆栈溢出异常,因为clony
无限构造自身:在clony
的构造函数中,您创建一个新的clony
对象并将其分配给字段c
:然后一次又一次地做同样的事情。
答案 1 :(得分:0)
这是因为堆栈还用于跟踪方法调用。每次调用方法(类的默认构造函数,在本例中)时,为此目的将某些信息添加到堆栈中。当你有无限递归时(就像你的构造函数一样),它会填满堆栈PDQ。
答案 2 :(得分:0)
我想这个:
clony c = new clony();
给你例外。
new clony() also has clony c = new clony()
里面......它会变成无穷大。
顺便说一下,类应该在开头用大写字母命名。