Java 静态初始化块跳过

Java 静态初始化块跳过,java,static,Java,Static,非公共类Out中的静态初始化块不运行,而静态嵌套类snOut中的静态初始化块运行。这怎么可能,为什么可能 public class staticNested { static{ System.out.println("In staticNested"); } static class sn{ static{ System.out.println("sn in staticNested"); }

非公共类
Out
中的静态初始化块不运行,而静态嵌套类
snOut
中的静态初始化块运行。这怎么可能,为什么可能

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

实际上,在您的代码中,您没有自己使用类
Out
。这就是为什么Java没有初始化它,也没有调用它的静态部分的原因


UPD:解释。您的代码导致类
Out.snOut的初始化,但这不是类
Out
初始化的原因您的内部类是静态的。这意味着它们就像外部类一样,其类型的对象可以在不需要父对象的情况下进行初始化。因此,在这里,父对象永远不会初始化,它们的静态初始化块也不会执行。

根据

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


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

我认为类
Out
从未加载过。当您访问它的静态字段或静态方法或创建实例时,它将加载。啊。我懂了。在main方法中创建新实例会使块运行。感谢
Out
不加载和
staticNested
加载的区别,因为main在
staticNested
中,它有点像您期望的那样自动加载。