在类中创建自己的对象,这是一个无止境的递归,为什么允许JAVA?

在类中创建自己的对象,这是一个无止境的递归,为什么允许JAVA?,java,class,Java,Class,代码如下: 输出为: its a endless loop 10 i = 10 这是一个正确的输出,但在第13行,我可以递归aa无线,为什么这不是一个错误 我想粘贴代码,但格式不好,很抱歉让您看到图片。这不是真正的递归。它只是执行固定次数的冗余操作 (提示:没有循环,重复也不是无止境的。) 类比:inti=1;i++;i++;i++也不是递归 实际发生的情况是以下部分的结果: 在运行时,字段访问表达式的结果计算如下:(假设程序在确定赋值分析方面是正确的,也就是说,每个空白的最终变量在访

代码如下:

输出为:

its a endless loop 10 
i = 10 
这是一个正确的输出,但在第13行,我可以递归aa无线,为什么这不是一个错误


我想粘贴代码,但格式不好,很抱歉让您看到图片。

这不是真正的递归。它只是执行固定次数的冗余操作

(提示:没有循环,重复也不是无止境的。)

类比:
inti=1;i++;i++;i++也不是递归


实际发生的情况是以下部分的结果:

在运行时,字段访问表达式的结果计算如下:(假设程序在确定赋值分析方面是正确的,也就是说,每个空白的最终变量在访问之前都被明确赋值)

  • 如果该字段是静态的:

    • 将对主表达式求值,并放弃结果。如果主表达式的计算突然完成,则字段访问表达式也会因为相同的原因突然完成

    • 如果字段不是final,或者是空final,并且字段访问发生在类变量初始值设定项(§8.3.2)或静态初始值设定项(§8.7)中,则结果是一个变量,即主表达式类型的类中指定的类变量

在您的示例中,当您在
a
的方法中引用
aa
时,这是引用类变量
a.aa
的另一种方式

理论上,每个
aa.
都会导致空检查。实际上,JIT编译器应该将其优化为一个。但这可能是毫无意义的:如果你关心性能,你就不会这么做


为什么他们一般都允许这样做

一般认为,允许无条件地访问静态变量是代码可读性的问题。但他们做出了这一决定,这是一个长期的尝试,修复它将具有极大的破坏性。所以它必须站起来


为什么他们允许你所遇到的特殊显现

您在示例中所写的内容显然毫无意义。然而,设计一种编程语言来禁止语言语法的无意义(但在其他方面是有效的)使用是不切实际的


你能做些什么吗


IIRC,一些Java风格的检查器、bug检查器和IDE会在您引用类变量而未对其进行限定时发出警告;i、 e.当你使用
aa
而不是
A.aa

1)粘贴代码时,如果你不能,有人会为你格式化。2) 我不明白这个问题,你所说的“无线递归aa”是什么意思?嗯,你可以写
.aa
尽可能多的次,但在你的计算机内存/硬盘空间耗尽之前,你只能写有限的次。Java允许您访问实例上的静态成员有点可疑,但是如果
aa
是非静态的,那么肯定应该允许编译代码(并且是)。这就是链表通常在Java中的实现方式,它不是infinte循环。它是有限的,因为你把它写下来了。。。