实例var引用一个对象

时间:2017-02-17 07:19:52

标签: java stack heap clone cloneable

实例变量在堆栈上,对象在堆上,对象引用在堆栈上。对?但是,如果实例变量是对象的引用呢?像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();
    }
}

如果它继续堆,为什么它会抛出并堆栈溢出错误?

3 个答案:

答案 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() 

里面......它会变成无穷大。

顺便说一下,类应该在开头用大写字母命名。