下面是一些玩具代码,演示了我的问题。第一个是可编译的版本,第二个是未编译的版本。

在示例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必须允许蓝色引用类-但如果可以避免,则不要这样做。

10-06 13:59