我正在学习界面行为.我已经创建了一个接口及其实现类,而在调用方法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)
你打电话的时候
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.
| 归档时间: |
|
| 查看次数: |
944 次 |
| 最近记录: |