如何在 Java 静态块中创建本地类? [复制]

Posted

技术标签:

【中文标题】如何在 Java 静态块中创建本地类? [复制]【英文标题】:How is it possible to create Local class in Java static block? [duplicate] 【发布时间】: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。它讨论了在静态上下文中被视为内部类的匿名类。这同样适用于本地类。 【参考方案1】:

定义说明一切

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

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

更新:-

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

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

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

【讨论】:

@M Sach,我怀疑实例的必要性。文档说“与实例方法和变量一样,内部类与其封闭类的实例相关联”。而本地类是一种内部类。 @Taisa 看到我的更新 什么是实例类?你的意思是内部类?本地类是内部类,不能以这种方式实例化。你为什么还要在这种情况下提出内部类?【参考方案2】:

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

此外,Local 类是 Inner Class 的一种特殊类型(不同于我们所知的匿名类),其对象在任何情况下都与外部类的对象相关联。

附注-

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

【讨论】:

所以本地类关联到类的对象,而不是实例?我只是想理解文档,当它说“与实例方法和变量一样,内部类与其封闭类的实例相关联” @Taisa 检查更新的答案

以上是关于如何在 Java 静态块中创建本地类? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ES6 类中创建“公共静态字段”?

ServletContextListener 和静态块

如何更快地在 Java 中创建/复制对象? [复制]

在抽象超类的静态方法中创建子类的实例? [复制]

如何在javascript类中创建一个静态字段[重复]

如何在 Java 中创建静态局部变量?