调用方法时java.lang.StackOverflowError

时间:2015-04-26 05:59:02

标签: java interface

我正在学习界面行为。我已经创建了一个接口及其实现类,而在调用方法m1()时,我得到了java.lang.StackOverflowError。我不知道为什么。任何人都可以告诉我这背后的正当理由!!!!!!  这是代码:

public interface Employee {
     String name="Kavi Temre";
}

public class Kavi implements Employee{
    Employee e= new Kavi();
    public static void main(String[] args) {

        Kavi kt=new Kavi();
        kt.m1();
    }

    void m1()
    {
        System.out.println(Employee.name);
        //System.out.println(e.name);
    }
}

两个sysout都给出了同样的错误:请告诉我这里到底发生了什么?

控制台输出:

Exception in thread "main" java.lang.StackOverflowError
    at Kavi.<init>(Kavi.java:2)
    at Kavi.<init>(Kavi.java:2)
    at Kavi.<init>(Kavi.java:2)
    at Kavi.<init>(Kavi.java:2)
    at Kavi.<init>(Kavi.java:2)
    at Kavi.<init>(Kavi.java:2)
    at Kavi.<init>(Kavi.java:2)
    .....

2 个答案:

答案 0 :(得分:6)

致电时

Kavi kt=new Kavi();

初始化e成员:

Employee e = new Kavi();

然后初始化自己的e成员,它为您提供了对Kavi构造函数的无限调用链。因此StackOverflowError。

相当于:

Employee e;
public Kavi ()
{
    e = new Kavi();
}

构造函数不应该在无限循环中调用它自己。

删除Employee e = new Kavi()行将解决您的问题。如果您的类必须包含对Employee的引用,请考虑将其传递给构造函数:

public Kavi ()
{
    this.e = null;
}

public Kavi (Employee e)
{
    this.e = e;
}

public static void main(String[] args) {

    Employee e = new Kavi ();
    Kavi kt=new Kavi(e);
    ...
}

另一种解决方案是改变:

Employee e = new Kavi();

static Employee e = new Kavi();

如果Kavi的所有实例共享Employee引用的同一e个实例,那将是一个有效的解决方案。

答案 1 :(得分:2)

在您的班级Kavi中,您声明了e类型的字段Employee,并使用新的Kavi对象对其进行初始化。

在创建Kavi类的第一个实例时,您将触发上述初始化并创建一个新的Kavi对象(第2行),该对象也会创建一个新的Kavi,依此类推。所以有问题的一行是

Employee e= new Kavi();

在创建了大量Kavi个对象后,堆栈将达到其极限并抛出异常。