2017-04-22 57 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被实例化此被执行。由于这条线将实例化一个新的实例,该线将被再次调用。

相关问题