我正在学习界面行为。我已经创建了一个接口及其实现类,而在调用方法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)
.....
答案 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
个对象后,堆栈将达到其极限并抛出异常。