下面是一些玩具代码,演示了我的问题。第一个是可编译的版本,第二个是未编译的版本。
在示例1中,为了创建InnerClass的实例,我必须在InnerClass的类定义下面创建该实例。这是有道理的,因为在类定义上方,InnerClass不可见。但是,为了简洁起见,我想在foo()的顶部创建并使用InnerClass的实例。有没有一种方法可以在实际的类定义之前动态定义InnerClass,这样我的代码看起来更像示例2,但可以是合法的Java?
例子1
public class OuterClass {
public void foo() {
class InnerClass {
public InnerClass() {
// do nothing.
}
}
InnerClass in = new InnerClass(); // Defined below, and compiles!
}
}
例子2
public class OuterClass {
public void foo() {
InnerClass in = new InnerClass(); // Defined above, does not compile!
class InnerClass {
public InnerClass() {
// do nothing.
}
}
}
}
最佳答案
从概念上讲,本地类声明是一个声明。在执行语句之前,该类不存在。当结束声明其作用域时,该类也会消失。通常,本地类可以引用其他本地作用域名称,因此执行顺序很重要。
void f()
{
if(true)
throw new Error();
class InnerClass
{
...
}
}
在此示例中,永远不会到达
InnerClass
声明语句,因此该类将永远不存在。事先引用它是没有意义的。在使用前声明一些东西总是一个好主意。在Java中,类可以具有循环依赖关系,因此Java必须允许蓝色引用类-但如果可以避免,则不要这样做。