这是我写的节目。我运行时遇到StackOverFlowError
异常:
public class maininherit {
maininherit h = new maininherit() {
@Override
public void mai() {
System.out.print("inner");
}
};
public static void main(String[] args){
maininherit t=new maininherit();
t.mai();
}
public void mai(){
System.out.print("hellllll");
h.mai();
}
}
只有在我使用StackOverflowError
类作为内部类的引用时,才会获得maininherit
。如果我正在使用其他类,我没有收到该错误。任何人都可以向我澄清这个吗?
抱歉,我感谢你的答案,但我怀疑我不知道是否合理或不重复只有当我在同一个类的构造函数中创建实例时才能重复初始化。那么它是如何可能的有多个初始化?
答案 0 :(得分:9)
内部类的实现只是覆盖maininherit类的一部分。所以... 你初始化类maininherit然后变量 h 被初始化。 新的运算符被调用然后......内部类init maininherit再次需要设置h变量。
您的代码是初始化h变量的无限循环。
答案 1 :(得分:1)
此处的问题不在于您的main
和mai
函数,而在于maininherit h
成员变量的初始化。问题是maininherit
的每个实例都在创建一个maininherit
对象(反过来会创建一个maininherit
对象,等等)。将其标记为static
成员将导致所有实例共享单个副本,这将解决此问题。
答案 2 :(得分:1)
这一行:
maininherit t=new maininherit();
创建一个新的maininherit对象(我称之为m0
),它有一个相同类型的字段(我称之为m1
)
创建m0时,初始化m1。 m1也有一个字段,因此m2被初始化。 m2也有一个字段,所以m3初始化等。
如果StackOverflowError
没有oocur
答案 3 :(得分:0)
例如你给的代码,即使没有内部类,它也会抛出stackoverflow错误
public class maininherit {
maininherit h=new maininherit();
public static void main(String[] args){
maininherit t=new maininherit();
t.mai();
}
public void mai(){
System.out.print("hellllll");
h.mai();
}}
避免将类本身的对象创建为成员或字段