2017-04-22 81 views
0
package geek; 

public class Gfg { 

    // constructor 
    Gfg() { 
     System.out.println("Geeksforgeeks"); 
    } 

    Gfg a = new Gfg(); 

    public static void main(String args[]) { 
     Gfg b; 
     b = new Gfg(); 
    } 
} 

這個程序在運行時是給 異常線程「main」 java.lang.StackOverflowError的爲什麼這段代碼給出錯誤?

爲什麼給這個錯誤?

+0

你是什麼意思,我不明白 – Ankit

+0

...因爲每次你創建一個Gfg實例,創建另一個Gfg實例,創建另一個,創建... – Seelenvirtuose

+0

所以我只創建Gfg insatnce一旦在主體中,那麼該課程中的課程也將被調用一次。那爲什麼會出現StackOverflow錯誤? – Ankit

回答

2

這是因爲要創建的類本身內部的類的實例導致出現StackOverflow。這導致嘗試創建Gfg的無限嵌套實例的無限遞歸。

刪除Gfg a = new Gfg();,因爲它沒有任何意義。

+0

爲什麼會導致遞歸調用,即使我創建對象一次 – Ankit

+0

@Ankit想想吧。當你創建一個實例時,它會調用'Gfg a = new Gfg();',這會創建另一個實例,導致'Gfg a = new Gfg();'創建另一個實例,從而導致'Gfg A =新GFG();'來再次調用,這會導致'GFG A =新GFG();'要運行,創建另一實例中,這會導致'GFG A =新GFG();'再次被稱爲,導致'Gfg a = new Gfg();'被運行,從而創建另一個實例,導致'Gfg a = new Gfg();'被再次調用,導致'Gfg a = new Gfg(); ',這將創建另一個實例,這... – Carcigenicate

+0

我的疑問是,當gfg b = new Gfg()將執行時,構造函數將被調用,然後執行將返回到main,那麼gfg將如何a = new Gfg1()將會到達。如果它已經在構造函數中,那麼我可以理解它會導致satckOverflow。在這種情況下,它是如何領先的 – Ankit

0

原因是下面的行,這會導致無限遞歸:

Gfg a = new Gfg(); 

每當Gfg被實例化此被執行。由於這條線將實例化一個新的實例,該線將被再次調用。

相關問題