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

时间:2015-03-10 07:24:25

标签: java recursion constructor scjp

考虑以下代码

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

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

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

2 个答案:

答案 0 :(得分:5)

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

  

8.8.7。构造函数主体

     

...

     

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

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

答案 1 :(得分:1)

您的代码永远不会通过编译。它应该给你编译时错误 - “递归构造函数调用