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
提交
取消