JDK 1.7 与 JDK 1.6 内部类继承差异
我正在解决一些Java难题,并偶然发现了这个:
public class Outer {
class Inner1 extends Outer {}
class Inner2 extends Inner1 {}
}
在编译此代码时,正如预期的那样,我收到以下错误:javac 1.6.0_45
Outer.java:8: cannot reference this before supertype constructor has been called
class Inner2 extends Inner1 {}
^
这是因为编译器为具有类似代码的类生成默认构造函数,这解释了上面的错误:Inner2
Inner2 () {
this.super();
}
现在很明显,因为你真的不能在Java 1.6.0_45,JLS 8.8.7.1中做到这一点(我可以猜到):
构造函数体中的显式构造函数调用语句不得引用此类或任何超类中声明的任何实例变量或实例方法,也不能在任何表达式中使用 this 或 super;否则,将发生编译时错误。
请参阅(在奇数情况下接受的答案为“在调用超类型构造函数之前无法引用此值”)
但是,如果我尝试编译它 - 没关系!javac 1.7.0_79
这就是问题 - Java 1.7中发生了什么变化,这个代码现在是正确的?
提前致谢!