【发布时间】:2016-05-19 15:03:39
【问题描述】:
来自 Java 文档:
本地类是定义在一个块中的类,它是一个 平衡大括号之间的零个或多个语句组。你 通常会找到在方法体中定义的本地类。
另外,Local 类是一种特殊的内部类,需要从外部类object实例化:
与实例方法和变量一样,内部类是关联的 其封闭类的实例
但是在类加载期间调用静态块,在创建对象实例之前。
那么,如何在静态初始化块中创建和实例化本地类?
例如:
class OuterClass {
static{
class InitLocalClass {
...
}
InitLocalClass lc = new InitLocalClass();
}
}
答案改编自本地类的 dup: 根据 JLS 项目 #15.9.2:
如果 C 是本地类(第 14.3 节),则令 O 成为最内层的词法 C的封闭类。令n是一个整数,使得O是第n个 类实例所在类的词法封闭类 创建表达式出现。那么:
如果 C 出现在静态上下文中,则 i 没有立即封闭 实例。
否则,如果类实例创建表达式出现在 静态上下文,然后发生编译时错误。
否则,i 的直接封闭实例是第 n 个 词法封闭 this 的实例(第 8.1.3 节)。
【问题讨论】:
-
为什么你不试试看看是否有编译器错误或者它是否有效?这是一个非常简单和完整的示例,因此很容易检查。对于这类问题,最好的办法是尝试。如果它可以正常工作,否则请尝试调查。
-
@Davide,我这里没有设置开发环境,但是我找到了一个在线工具。它有效,但我想了解原因。它是否与类对象本身相关联?我会编辑我的问题。谢谢
-
“它是否与类对象本身相关联” 不,与静态嵌套类不相关。
-
@Andy 但是静态嵌套类不是内部类。内部类完全是非静态嵌套类。而本地类是一种内部类。
-
见here。它讨论了在静态上下文中被视为内部类的匿名类。这同样适用于本地类。