首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JDK 1.7与JDK 1.6内部类继承差异

JDK 1.7与JDK 1.6内部类继承差异
EN

Stack Overflow用户
提问于 2016-03-08 04:07:54
回答 2查看 658关注 0票数 17

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

代码语言:javascript
运行
复制
public class Outer {
    class Inner1 extends Outer {}
    class Inner2 extends Inner1 {}
}

在用javac 1.6.0_45编译这段代码时,不出所料,我得到了这个错误:

代码语言:javascript
运行
复制
Outer.java:8: cannot reference this before supertype constructor has been called
class Inner2 extends Inner1 {}                                                                                                
^

这是因为编译器使用类似的代码为Inner2类生成默认构造函数,这解释了上面的错误:

代码语言:javascript
运行
复制
Inner2 () {
    this.super();
}

现在很明显了,因为你真的不能在JavaJLS8.8.7.1中做到这一点(正如我所猜测的那样):

构造函数体中的显式构造函数调用语句不能引用该类或任何超类中声明的任何实例变量或实例方法,也不能在任何表达式中使用this或super;否则,将发生编译时错误。

请参见(Odd situation for "cannot reference this before supertype constructor has been called"中的accepted answer)

但是如果我尝试用javac 1.7.0_79编译它-它是可以的!

问题来了--在Java1.7中做了什么改变,这段代码现在是正确的吗?

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-09 11:20:20

看起来在Java bug跟踪器上讨论了与bug JDK-6708938: Synthetic super-constructor call should never use 'this' as a qualifier相同的问题。

此外,我认为这将是很棒的,你可以看看之前的其他相关问题,例如JDK-4903103: Can't compile subclasses of inner classes

请注意这两个bug的修复版本。

其结果见Maintenance Review of JSR 901 (Java Language Specification) for Java SE 7

来自The Java Language Specification Third Edition

否则,S是一个内部成员类(§8.5)。如果S不是词法封闭类的成员,或者不是其超类或超接口的成员,则它是编译时错误。设OS是其成员的最内层的词法封闭类,n是整数,使得OC的第n个词法封闭类。与S相关的紧随其后的i实例是它的第n个词法封闭实例。

和来自JSR901 (Java Language Specification) for JavaSE7(完整版,第242页,蓝色文本)的维护审查或The Java Language Specification, Java SE 7 Edition中的相同内容(恰好在8.8.8节之前)

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

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

I相对于S的直接封闭实例是this的第n个词汇封闭实例。

所以你可以看到有编译时错误的部分已经消失了。

票数 6
EN

Stack Overflow用户

发布于 2016-03-09 02:02:42

我怀疑这与invoke dynamic有关,它是在Java1.7中添加的,目的是为Java8中的lambda做准备。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35853023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档