java.lang.StackOverflowError 调用方法时

java.lang.StackOverflowError while calling a method

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

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.WhosebugError
    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)
    .....

当你打电话时

Kavi kt=new Kavi();

它初始化 e 成员 :

Employee e = new Kavi();

然后初始化它自己的 e 成员,这给了你对 Kavi 构造函数的无限调用链。因此 WhosebugError。

相当于:

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

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

删除 Employee e = new Kavi() 行将解决您的问题。如果您的 class 必须包含对 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 的所有实例共享由 e 引用的相同 Employee 实例,那将是一个有效的解决方案。

在您的 class Kavi 中,您正在声明一个 e 类型 Employee 的字段并使用新的 Kavi 对象对其进行初始化。

当创建 class Kavi 的第一个实例时,您将触发上述初始化并创建一个新的 Kavi 对象(第 2 行),该对象还会创建一个新的 Kavi 等等等等。所以有问题的行是

Employee e= new Kavi();

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