Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的递归理论_Java_Recursion - Fatal编程技术网

Java中的递归理论

Java中的递归理论,java,recursion,Java,Recursion,Oracle的文档说,创建一个对象有三个部分 (声明、实例化和初始化)。它还“暗示”他们 “按顺序来”,但它并没有明确地说这一点(尽管这通常看起来是正确的) 所以,我想知道, 基于我示例中不正确编码的构造函数将导致递归的事实, 在这种情况下(就事件顺序而言),是否有可能 实例化对象首先发生,这(在本例中也是如此)是因为 递归对象引用声明从未发生过 public Test(){ Test t1 = new Test(); } 类测试的新实例将继续创建,直到所有堆栈空间用完,JVM将关闭,并给出

Oracle的文档说,创建一个对象有三个部分 (声明、实例化和初始化)。它还“暗示”他们 “按顺序来”,但它并没有明确地说这一点(尽管这通常看起来是正确的)

所以,我想知道, 基于我示例中不正确编码的构造函数将导致递归的事实, 在这种情况下(就事件顺序而言),是否有可能 实例化对象首先发生,这(在本例中也是如此)是因为 递归对象引用声明从未发生过

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


类测试的新实例将继续创建,直到所有堆栈空间用完,JVM将关闭,并给出堆栈溢出错误。

声明始终放在第一位,事实上,它可以发生在方法开始时,无论您首先在何处提到变量(因为它们是立即创建的)

未能实例化,可能导致初始化未发生

如果构造函数没有正常退出(这里会出现StackOverflowerError),则不会设置声明的字段或变量,而是会抛出一个错误

在上述示例中,
t1
将不会在任何点设置

“从右向左读取赋值运算符…”

这可能有助于思考

Test t1 = new Test();
作为


这很容易让你自己尝试一下。试试看,并记下结果

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

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

您需要声明类
Test
的实例,以便首先启动递归。但是,对象的实例化永远不会返回,因此声明永远不会成功。

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

这里的例子是无限递归,因为没有任何东西允许我们退出递归循环。正如其他人之前所说,这将导致堆栈溢出错误,因为JVM将不断创建并分配内存分配给测试对象,直到它耗尽内存空间。

不,声明总是发生在任何语言中的第一递归理论:递归是傻瓜的第一选择,也是绝望的最后选择,然而,有能力的程序员@DwB,递归是一种优雅、简洁的方法来描述一些计算。若优雅、紧凑的源代码并没有任何价值,那个么我们仍然会用汇编语言编写。对于许多问题,递归也恰好是实用的。如果不是,那么就没有人会使用它。此外,一个好的编译器知道如何将尾部递归转化为迭代函数。是的,有些情况下这是个坏主意,但并非所有情况下都是这样。这就是我一直在寻找的理由!然后,就事件而言,递归(如果存在)确实发生在对象声明之后。这听起来似乎很简单,但问题的起因是“赋值运算符是从右向左读取的……”我想我读得太深了。这很有帮助。@vee添加了一个可能会有所帮助的说明。这些实例实际上会被完全创建吗?
Test t1;
t1 = new Test();
public Test()
{
    Test t1 = new Test();
}

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