为什么这个递归构造函数不会导致编译时错误?

Sar*_*eet 3 java recursion constructor scjp

考虑以下代码

class ConstructorDemo2{
    ConstructorDemo2(){
        this(1);
    }
    ConstructorDemo2(int i){
        this();
    }
    public static void main(String[] args){
        new ConstructorDemo2();
    }
}
Run Code Online (Sandbox Code Playgroud)

Kathy Sierra的SCJP6书在第144页上说,这样的代码可能无法检测到并导致StackOverflowError.但与此同时,我们知道子类构造函数ALWAYS必须使用super()[默认由编译器提供] 来调用超类构造函数,但在下面的代码示例中,两个构造函数都在调用this()(相互调用).
它确实显示了error: recursive constructor invocation我的OpenJDK编译器中的错误,但Kathy Sierra的书中说这样的代码可能不会被编译器检测到并且会在运行时抛出异常.

因此,如果在SCJP/OCJP考试中向我展示了这样的代码示例,并询问它是否会编译,那么答案是什么?看起来有点暧昧

Era*_*ran 5

如有疑问,请阅读JLS所说的内容:

8.8.7.构造体

...

构造函数通过一系列涉及此的一个或多个显式构造函数调用直接或间接调用自身是一个编译时错误.

因此,您的代码不应该通过编译.如果某些编译器未检测到此错误,则它不符合Java语言规范.

  • @Sarabjeet我相信JLS会超过任何一本书,尤其是当它在这个问题上做出如此明确的陈述时. (3认同)
  • 有争议的书中的材料可能起源于JDK 1.4.1之前 - 也就是说,当javac无法检测到这一点时,一个类可能有不可用的构造函数. (2认同)