【发布时间】:2010-08-01 19:40:06
【问题描述】:
为什么这段代码不能编译?
public class A {
public class B extends A {
public B(A a) { }
}
void foo() {
A a = new A();
new B(a) { };
}
}
A.java:[7,17] cannot reference this before supertype constructor has been called
如果进行了以下任一更改,则编译成功:
-
B是私有的而不是公共的 - 第 7 行读取
new B(A);而不是new B(A) { }
使用javac版本:1.6.0_20
【问题讨论】:
-
你认为
new B(a) {}会做什么? -
new B(a) {} 应该实例化 B 的匿名子类,其默认构造函数调用 super(a)
-
显然,我正在尝试编写的实际代码在该块中有覆盖方法 - new B(a) { /* stuff goes here */} - 但我删除了不必要的代码,目的是简化这个问题。
-
它在 Joshua Bloch 的 Java Puzzlers 中排名第 90。在其示例章节中作为 #9 提供:javapuzzlers.com/java-puzzlers-sampler.pdf。就个人而言,即使在阅读解决方案后我也无法理解。
-
我还要注意 Intellij IDEA 不同意每个人 - 它认为所有这些代码都很好。
标签: java