Java 引用对象的实例变量
实例变量在堆栈上,对象在堆栈上,对象引用在堆栈上。对吗?但如果一个实例变量是对一个对象的引用呢?与var c类似:Java 引用对象的实例变量,java,clone,heap-memory,stack-memory,cloneable,Java,Clone,Heap Memory,Stack Memory,Cloneable,实例变量在堆栈上,对象在堆栈上,对象引用在堆栈上。对吗?但如果一个实例变量是对一个对象的引用呢?与var c类似: class clony implements Cloneable { clony c = new clony(); @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } class tst2
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();
}
}
如果它进入堆,为什么会抛出堆栈溢出错误?这是因为堆栈还用于跟踪方法调用。每次调用一个方法(在本例中是类的默认构造函数)时,都会为此向堆栈中添加某些信息。当你有无限递归(就像你的构造函数一样)时,它会填满堆栈PDQ。这是因为堆栈也被用来跟踪方法调用。每次调用一个方法(在本例中是类的默认构造函数)时,都会为此向堆栈中添加某些信息。当你有无限递归时(就像你的构造函数一样),它会填满堆栈PDQ。你的引用
c
是类clony
的一个字段。这意味着引用将存储在为clony
对象分配的内存区域内的堆上
由于
clony
无限地构造自身,您的程序抛出堆栈溢出异常:在clony
的构造函数内,您创建一个新的clony
对象并将其分配给字段c
:该字段将反复执行相同的操作。您的引用c
是类的一个字段clony
。这意味着引用将存储在为clony
对象分配的内存区域内的堆上
你的程序会抛出堆栈溢出异常,因为clony
会无限地构造自己:在clony
的构造函数中,你创建了一个新的clony
对象并将其分配给字段c
:然后它会一次又一次地做同样的事情。我认为:
clony c = new clony();
给你一个例外
new clony() also has clony c = new clony()
里面。。。它会无限大
顺便说一下,类的名字应该在开头用大写字母命名。我认为:
clony c = new clony();
给你一个例外
new clony() also has clony c = new clony()
里面。。。它会无限大
顺便说一下,类的名字应该在开头用大写字母命名