Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDK1.7与JDK1.6内部类继承差异_Java_Java 7_Inner Classes_Java 6 - Fatal编程技术网

Java JDK1.7与JDK1.6内部类继承差异

Java JDK1.7与JDK1.6内部类继承差异,java,java-7,inner-classes,java-6,Java,Java 7,Inner Classes,Java 6,我正在解决一些Java难题,偶然发现了这个: public class Outer { class Inner1 extends Outer {} class Inner2 extends Inner1 {} } 当使用javac1.6.045编译此代码时,正如预期的那样,我得到了以下错误: Outer.java:8: cannot reference this before supertype constructor has been called class Inner2

我正在解决一些Java难题,偶然发现了这个:

public class Outer {
    class Inner1 extends Outer {}
    class Inner2 extends Inner1 {}
}
当使用
javac1.6.045
编译此代码时,正如预期的那样,我得到了以下错误:

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; 否则,将发生编译时错误

见(中)

但是如果我试着用
javac1.7.0\u79
编译它,就可以了

现在有一个问题-Java 1.7中发生了什么变化,这段代码现在是正确的?


提前谢谢

我怀疑这与java 1.7中添加的为java 8中的lambda做准备的代码有关。

看起来在java bug追踪器上讨论了与bug相同的问题

此外,我认为你们最好看看上一篇文章中的其他相关问题

请注意这两个bug的固定版本

正如结果所见

否则,
S
是一个内部成员类(§8.5)。这是一个编译时间 如果
S
不是词汇封闭类或 超类或其超接口。让
O
成为最里面的词汇
S
是其成员的封闭类,且设n是这样的整数
O
C
的第n个词汇封闭类。马上 关于
S
i
的封闭实例在词汇上是第n个 封闭的实例

以及Java SE 7(完整版本,第242页,蓝色文本)的JSR 901(Java语言规范)的维护审查或相同的(在第8.8.8节之前)

否则,S是一个内部成员类(§8.5)

设O是S的最内层词汇封闭类,n是一个整数,使得O是 C的第n个词汇封闭类

立即封闭的 关于S的i的实例是第n个词汇封闭的 举个例子


因此,您可以看到出现编译时错误的部分已消失。

@EJP您是否检查了该部分的外观relevant@EJP,而且,
this.super()
并不等同于
super()
。如果您尝试在非内部非嵌套类中执行此操作,则会在[JLS1.6 8.8.7.1]之前出现编译时错误<代码>如果S不是内部类,或者如果S的声明发生在静态上下文中,则不存在关于S的立即封闭的i实例。如果超类构造函数调用是合格的超类构造函数调用,则会发生compiletime错误。类似于[JLS1.7 8.8.7.1]。我首先检查了它。可悲的是,事实并非如此。我在所有三个
.class
文件、
Outer.class
Outer$Inner1.class
Outer$Inner2.class
上使用了
javap-c
。没有证据表明
invokedynamic
,只有
invokespecial
putfield
。我目前正在调查这个问题,但还没有结果。谢谢你的回复!现在我有了一个线索,有些东西肯定已经改变了!但我不明白到底是什么。在整个8.8节中,我没有发现
JLS SE 7
JLS第三版
之间有任何重大差异。@ar4ers我已经添加了与此问题相关的这两个JSL版本的差异。非常感谢您的补充说明!现在我明白了区别。而且,您可能也知道,在哪里可以找到特定的行为定义(如合成构造函数创建)?正如我所猜测的——这是JVM,我说的对吗?@ar4ers我猜你可以在JLS(更特定于编译器)和JVM(更特定于运行时)中找到它。如果你想阅读它们,你可以在