此代码在运行时显示错误:
class Animal {
Animal object1 = new Animal();
public static void main(String[] args) {
Animal obj = new Animal();
}
}
这是与main Animal obj = new Animal();
这一行略有不同的代码
方法评论出来。此代码显示没有运行时错误。
class Animal {
Animal object1 = new Animal();
public static void main(String[] args) {
// Animal obj = new Animal();
}
}
这是如何引起的,我该如何解决?我正在使用命令提示符来运行此代码。
答案 0 :(得分:15)
如果你有一个成员变量初始化为同一个类的实例,那么当创建该实例时,它还将有一个成员变量,该变量被初始化为同一个类的实例,并且当该实例是在创建时,它还会有一个成员变量,它被初始化为同一个类的实例,并且当创建该实例时,它还将有一个成员变量,该变量被初始化为同一个类的实例,并且当该实例是在创建时,它还会有一个成员变量,它被初始化为同一个类的实例,并且当创建该实例时,它还将有一个成员变量,该变量被初始化为同一个类的实例,并且当该实例是在创建时,它还会有一个成员变量,它被初始化为同一个类的实例,并且当创建该实例时,它还将有一个成员变量,该变量被初始化为同一个类的实例,并且当该实例是CRE它也将有一个成员变量,它被初始化为同一个类的一个实例,并且当创建该实例时,它还将有一个成员变量,该变量被初始化为同一个类的实例,并且当该实例是在创建时,它还会有一个成员变量,它被初始化为同一个类的实例,并且当创建该实例时,它还将有一个成员变量,该变量被初始化为同一个类的实例,并且当该实例是在创建时,它还会有一个成员变量,它被初始化为同一个类的实例,并且当创建该实例时,它还将有一个成员变量,该变量被初始化为同一个类的实例,并且当该实例是在创建时,它还会有一个成员变量,它被初始化为同一个类的实例,并且在创建该实例时,它还将有一个成员变量,该变量被初始化为同一个类的实例...
然后堆栈将溢出并停止。对象可以指向同一个类的另一个实例作为成员,但是在构造函数中创建该实例,或者在类的主体中初始化它,或者以递归方式创建对象直到你的堆栈溢出。通常,如果您需要这样的成员变量,则接受该对象作为构造函数参数。
答案 1 :(得分:5)
简短回答无限递归。
如果您想要这样的递归数据结构,可以做很多答案:
public class A {
A object1;
public A(A member) {
this.object1 = member;
}
public static void main(String[] args) {
A item = new A(new A(null)); // note the base case/termination of the recursion!
}
}
或者:
public class B {
B object1;
public void init() {
object1 = new B();
}
public static void main(String[] args) {
B item = new B();
item.init();
// now item.object1 != null, but item.object1.object1 == null
}
}
在任何一种情况下,您的数据结构中都会有“sentinel”或“leaf”节点,这些节点指向null
值。
答案 2 :(得分:2)
这是一个堆栈溢出。
它与从同一函数调用函数类似,如下所示:
void func(){
func();
}
它将重复,直到堆栈填满,然后程序将崩溃。
干杯。