2017-02-17 80 views
0

实例变量去堆栈和对象去堆和对象引用的栈去。对?但是如果一个实例变量是一个对象的引用呢?喜欢var c:实例VAR参照对象

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

这是因为堆栈也被用来跟踪方法调用。每次你调用一个方法(类的默认构造函数,在这种情况下)时,某些信息被添加到堆栈用于这一目的。当你有无限递归时(就像你的构造函数一样),填充堆栈PDQ。

2

您参考c是类clony的领域。这意味着将参考可存储在被分配用于clony对象的存储器区域内的堆。

而且你的程序抛出一个堆栈溢出异常,因为clony无限构造本身:里面的clony构造函数创建一个新的clony对象并将其分配给现场c:然后一次又一次地做同样的事情。

0

我想这:

clony c = new clony(); 

,让您有例外。

new clony() also has clony c = new clony() 

里面...它走向无限。

顺便说一句,类应该在开始大写字母来命名。