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