给出以下代码:
public class Classa {
int x=10;
void func(){
}
Classa inner=new Classa(){
void func(){
x=90;
}
};
public static void main(String[] args) {
Classa c=new Classa();
c.inner.func();
}
}
为什么我的应用在实例化期间崩溃了? (考虑调试器) 它进入某种无限的递归。有什么想法吗?
答案 0 :(得分:3)
因为你有
Classa inner=new Classa()
相当于
class Classa {
Classa inner;
Classa() {
inner = new Classa();
}
}
保持实例化一个与包含类相同类型的内部变量,从而创建无限量的实例。
要初始化Classa
实例,您需要分配Classa
类型的内部变量,这里是无限递归。
答案 1 :(得分:2)
您正在调用新的Classa()。这会触发要构造的类。
现在想一想,inner
变量如何实例化?在构造函数调用中,它递归调用inner = new Classa()
那么现在该通话会发生什么?递归重复该过程,直到您的堆栈溢出
答案 2 :(得分:1)
您正在从Classa构造函数中调用new Classa()
。
答案 3 :(得分:1)
当您尝试构造新的Classa
对象时,实例变量inner
会在构造过程中被初始化,从而导致对Classa
构造函数的另一次调用,因此代码进入无休止的递归。
答案 4 :(得分:1)
您有一个在您的班级中定义的实例变量inner
。您正在将其初始化为Classa
的匿名子类。这将创建另一个Classa
实例。但是这个新实例将尝试创建自己的inner
,从而导致无限循环调用创建Classa
的实例。每次调用都会将事物放在堆栈上,最终会产生StackOverflowError
个结果。
阻止它的一种方法是制作inner
static
,因此整个班级只有一个inner
:
static Classa inner = new Classa(){