class Demo {
Demo d = new Demo();
}
class Test {
Demo d = new Demo();//编译通过
main() {
new Demo();//堆栈溢出
}
}
如上代码 ,为什么Test类main方法中的会报错,但是成员中的编译通过呢
6 回答
函数式编程
TA贡献1807条经验 获得超9个赞
你要问的应该是为什么编译能通过.但还是堆栈溢出了.
编译:只是检测语法问题.你这个是逻辑BUG.编译器检查不出来的.必须要运行起来才能知道会溢出.
编译的时候并没有运行.
你需要搞清楚2个时间:编译时,运行时.就像宏命令只是编译时生效一样.宏命令属于编译时.而这种代码运行时才会抛出的bug.属于运行时.编译器无能为力
心有法竹
TA贡献1866条经验 获得超5个赞
因为你在Demo类中递归实例引用了,所以new的时候会爆栈,改成如下:
class Demo {
static Demo d = new Demo();
}
精慕HU
TA贡献1845条经验 获得超8个赞
解释一下为什么会溢出吧:
一个类实例化的时候,会先运行其成员变量的语句。即你在Test类中调用new Demo()的时候,实例化这个Demo的时候,会先执行Demo类中的Demo d = new Demo()这一句,这时候又要求实例化Demo, 此时又要先执行Demo d = new Demo(), 然后又要求实例化Demo...... 这样就形成了死循环,最终溢出。
添加回答
举报
0/150
提交
取消