2014-12-04 67 views
2

我有一个非常基本的Java理论问题。为什么Employee类在下面的例子中以递归方式调用自己?Java类实例递归调用

class Employee { 

Employee emp = new Employee(); 

} 

public class Manager extends Employee { 

    public static void main(String[] args){ 

     Manager mgr = new Manager(); 

    } 
} 
+3

您正在实例化一个Employee类,它将您Employee类的白化,它实例化了自己的Employee类,它实例化了它自己的Employee类等等。这个问题意味着你缺乏对面向对象软件的基本理解。重新阅读基础知识:) – Dennisch 2014-12-04 14:17:29

+0

为什么你放置你的第二行'Employee' create,是因为你认为你必须创建它,才能拥有继承层次结构,或者它是由选择构成的,你希望每个Employee参考另一名员工?也许我们可以进一步帮助你。 – 2014-12-04 14:25:15

+0

@ Dennisch我认为从我的问题中应该很清楚,我缺乏基本的理解,这就是为什么我问这个问题。我在一本书中读了这个例子,但我不明白这个解释。感谢Jesper的详细解释。 – 2014-12-05 14:47:17

回答

3

再看一下代码做什么:

当你创建一个新的Manager对象,该对象ManagerEmployee部分也将被初始化(因为Manager延伸Employee)。

Employee零件初始化时,其emp成员变量将被初始化。它将用新的Employee对象初始化。但是该对象也有一个emp成员变量,该变量将用新的Employee对象初始化。并且该对象还有一个emp成员变量,该变量将使用新的Employee对象进行初始化。并且该对象还有一个emp成员变量,该变量将使用新的Employee对象进行初始化。并且该对象还有一个emp成员变量,该变量将使用新的Employee对象进行初始化。并且该对象还有一个emp成员变量,该变量将使用新的Employee对象进行初始化。并且该对象还有一个emp成员变量,该变量将使用新的Employee对象进行初始化。 ...等,直到堆栈溢出。

+0

请注意,他不在其代码中创建员工。他只创建一个经理。所以他的问题不是关于递归,而是关于继承。 – 2014-12-04 14:16:20

+2

但'Manager'延伸'Employee',所以'Manager'对象的'Employee'部分也将被初始化,导致递归循环。 – Jesper 2014-12-04 14:17:55

+1

当然,但你没有解释这一点。 – 2014-12-04 14:18:35

0

跳过评论对象的创建,每次创建一个Employee当您创建Manager,因为它继承了它,它进入一个内部循环恰好。

class Employee { 

//Employee emp = new Employee(); 

} 
0
class Employee { 
    Employee emp = new Employee(); 
} 

这意味着每个Employee包含的另一个Employee一个实例。因此,当您的Employee构建时,它也必须创建它包含的Employee。但是,通过相同的逻辑,Employee也必须具有必须构建的自己的子节点Employee,依此类推。