0

来自 Java 文档:

局部类是在一个中定义的类,它是一组在平衡大括号之间的零个或多个语句。您通常会发现在方法体中定义的本地类。

此外,Local 类是一种特殊的内部类,需要从外部类对象实例化:

与实例方法和变量一样,内部类与其封闭类的实例相关联

但是静态块是在类加载期间调用的,在创建对象实例之前。

那么,如何在静态初始化块中创建和实例化本地类呢?

例如:

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 的直接封闭实例是 this 的第 n 个词法封闭实例(第 8.1.3 节)。

4

2 回答 2

0

很好的定义说明了一切

局部类是在一个块中定义的类,它是一组在平衡大括号之间的零个或多个语句。您通常会发现在方法体中定义的本地类。

简而言之,你可以做到。无论是内部方法还是静态

更新 :-

实例类与实例相关联。它们也可以在类外实例化

OuterClass outer=new OuterClass ();
OuterClass.InnerClassinner=outer.new InnerClass();

但是可以从块中调用本地类

于 2016-05-19T15:12:58.537 回答
0

无论是静态初始化块还是静态方法(仅提及),您都可以创建类的对象并定义本地类。

此外,Local 类是内部类的一种特殊类型(除了我们所知的匿名类),其对象在每种情况下都与外部类的对象相关联。

PS -

静态块中的内部类的实例与包含它的类的任何实例都不相关。

于 2016-05-19T15:26:45.683 回答