调用方法时java.lang.StackOverflowError

kav*_*mre 3 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

两个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)
    .....
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 6

你打电话的时候

Kavi kt=new Kavi();
Run Code Online (Sandbox Code Playgroud)

它初始化e成员:

Employee e = new Kavi();
Run Code Online (Sandbox Code Playgroud)

然后初始化它自己的e成员,它给你一个无限的调用Kavi构造函数链.因此StackOverflowError.

它相当于:

Employee e;
public Kavi ()
{
    e = new Kavi();
}
Run Code Online (Sandbox Code Playgroud)

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

删除该Employee e = new Kavi()行将解决您的问题.如果您的类必须持有对a的引用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);
    ...
}
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是改变:

Employee e = new Kavi();
Run Code Online (Sandbox Code Playgroud)

static Employee e = new Kavi();
Run Code Online (Sandbox Code Playgroud)

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