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