在该类中声明一个类的实例

此代码在运行时显示错误:

class Animal { Animal object1 = new Animal(); public static void main(String[] args) { Animal obj = new Animal(); } } 

这与Animal obj = new Animal();略有不同Animal obj = new Animal(); 来自main方法的这一行注释掉了。 此代码显示没有运行时错误。

 class Animal { Animal object1 = new Animal(); public static void main(String[] args) { // Animal obj = new Animal(); } } 

这是怎么造成的,如何解决? 我正在使用命令提示符来运行此代码。

如果你有一个成员变量初始化为同一个类的实例,那么当创建该实例时,它还将有一个成员变量,该变量被初始化为同一个类的实例,并且当创建该实例时,它还将有一个成员变量,该变量初始化为同一个类的实例,并且在创建该实例时,它还将具有一个成员变量,该变量初始化为同一个类的实例,并且在创建该实例时,它还将有一个成员变量,该变量初始化为同一个类的实例,并且在创建该实例时,它还将具有一个成员变量,该变量初始化为同一个类的实例,并且在创建该实例时,它还将有一个成员变量初始化为同一个类的实例,并且在创建该实例时,它还将有一个成员变量,该变量初始化为同一个类的实例,并且当该实例创建时 d,它还有一个成员变量,它被初始化为同一个类的一个实例,当创建该实例时,它还有一个成员变量,它被初始化为同一个类的实例,当该实例是在创建时,它还将有一个成员变量,它被初始化为同一个类的实例,并且在创建该实例时,它还将有一个成员变量,该变量被初始化为同一个类的实例,并且当该实例是在创建时,它还将有一个成员变量,它被初始化为同一个类的实例,并且在创建该实例时,它还将有一个成员变量,该变量被初始化为同一个类的实例,并且当该实例是在创建时,它还将有一个成员变量,该变量初始化为同一个类的实例,并且在创建该实例时,它还将具有一个成员变量,该变量被初始化为同一个类的实例…

然后堆栈将溢出,它将停止。 对象可以指向同一个类的另一个实例作为成员,但是在构造函数中创建该实例,或者在类的主体中初始化它,或者以递归方式创建对象直到你的堆栈溢出。 通常,如果您需要这样的成员变量,则接受该对象作为构造函数参数。

简短回答无限递归。

如果你想要这样的递归数据结构,你可以做这样的事情:

 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值。

这是堆栈溢出。

它类似于从同一个函数调用函数,如下所示:

 void func(){ func(); } 

它会重复,直到堆栈填满,然后程序将崩溃。

干杯。