java - 静态初始化 block 跳过

标签 java static

非公共(public)类 Out 中的静态初始化 block 不运行,但静态嵌套类 snOut 中的静态初始化 block 运行。这是如何以及为何可能的?

public class staticNested {

    static{
        System.out.println("In staticNested");
    }

    static class sn{

        static{
            System.out.println("sn in staticNested");
        }

        void p(){
            System.out.println("In static nested class method p");
        }
    }

    public static void main(String [] args){
        sn n = new sn();
        n.p();

        Out.snOut no = new Out.snOut();
        no.p();
    }
}

 class Out{

     static{
         System.out.println("In Out"); //Skips this
         System.out.println("Here");  //Skips this
     }

     static class snOut{

         static {
             System.out.println("In snOut in Out");
         }

            private int x;

            void p(){
                System.out.println("In snOut in outside Class out: " + x);
            }

        }
    }

这是输出:

In staticNested
sn in staticNested
In static nested class method p
In snOut in Out
In snOut in outside Class out: 0

最佳答案

根据JLS 8.1.3

其声明发生在静态上下文中的内部类I的实例没有词法封闭实例

在您的代码中,您尝试访问静态类sn,因此根据规范,它不会有任何封闭类。这就是为什么封闭类的静态 block 没有执行的原因。

关于java - 静态初始化 block 跳过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14163917/

相关文章:

java - Findbugs 错误 - Bug : br is null guaranteed to be dereferenced on exception path

java - 如何以正确的方式对字符进行编码和解码

java - 有没有办法从 Doxygen 输出中排除包级函数和成员?

c - 在 C 中声明我的 int 数组

java - 退出嵌套的 switch 语句到外部 switch 语句

java - 升级到 Spring Boot 2 后应用程序无法启动

c++ - 解决由全局静态变量引起的内存问题

java - 使用 Singleton 类中的静态 GSON 对象将 Java 对象序列化为 JSON

java - 在 Solr 中索引数据以进行搜索

c++ - 如何在 C++ 源文件之间共享静态变量?