2014-06-10 55 views
0

Oracle的文档说,有三个部分来创建对象 (声明,实例化和初始化)。它也意味着它们“按顺序排列”,但它没有明确地说明这一点(虽然这通常似乎是正确的)。Java中的递归理论

所以,我想知道如果, 基于这样的事实,在我的例子中,不正确编码的构造将导致递归, 是否有可能在这种情况下(有关于事件的序列)试图 到实例化对象首先发生,并且(在这种情况下)由于 递归,对象引用声明从不发生....?

public Test(){ 
Test t1 = new Test(); 

}

+0

不,总是首先发生声明 –

+1

任何语言的递归理论:递归是goofball的第一选择,也是绝望而又胜任的程序员的最后选择。 – DwB

+2

@DwB,递归是一种优雅,紧凑的方式来描述一些计算。如果优雅,紧凑的源代码没有价值,那么我们仍然会用汇编编写。对于许多问题,递归也恰好是_practical_。如果不是,那么没有人会使用它。另外,一个好的编译器知道如何将尾递归转换为迭代函数。是的,有些情况下它是一个坏主意,但在所有情况下都不是这样。 –

回答

1

宣言永远是第一位的,其实它可以在方法,无论你在哪里首先要提及一个变量(因为它们是在一次创建)

失败实例的开始发生,可能会导致intialisation不发生。

如果构造函数没有正常退出(这里您将得到一个StackOverflowError)声明的字段或变量将不会被设置,而是会抛出一个错误。

在上面的例子中,t1不会在任何点设置。

“赋值运算符是从右向左读的......”

它可能会以为

Test t1 = new Test(); 

Test t1; 
t1 = new Test(); 
+0

Ahhhh。这是我寻找的理由!然后,就事件而言,递归(如果存在)确实发生在对象声明之后。可能听起来像是一件容易的事,但是让问题开始的原因是“一个赋值操作符是从右到左读的......”。我认为我正在读得太深。这很有帮助。 – Michael

+0

@vee添加了可能有所帮助的说明。 –

2
public Test(){ 
Test t1 = new Test(); 

} 

Test类的新实例将继续创建,直到所有堆栈空间已用尽,你JVM将关闭给堆栈溢出错误。

+0

实例是否会完全创建? –

0

,这是很有帮助很容易尝试自己。尝试一下并记下结果。

public Test() 
{ 
    Test t1 = new Test(); 
} 

public static void main(String[] args) 
{ 
    Test t = new Test(); 
} 
+1

感谢您的测试 – Michael

0

您需要以声明类Test的实例为您递归摆在首位踢出。但是,对象的实例化从不返回,所以声明从不成功。

-1

是的。它是递归的并且会溢出堆栈。最好的测试方法是使用调试器。

0

这里有一个无限递归的例子,因为没有什么可以让我们退出递归循环。正如其他人之前所说的那样,这将导致堆栈溢出错误,因为JVM将持续创建内存分配并将其分配给Test对象,直到内存空间用完。