【问题标题】:Static initialization block skips静态初始化块跳过
【发布时间】:2013-01-04 19:49:36
【问题描述】:

非公共类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 类已加载。当您访问其静态字段或静态方法或创建实例时,它会加载。 我的初学者知识>
  • 啊。我懂了。在 main 方法中创建一个新实例会使块运行。谢谢
  • Out 不加载和 staticNested 加载的不同之处在于 main 在 staticNested 中,它像您所期望的那样自动加载。

标签: java static


【解决方案1】:

根据JLS 8.1.3

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

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

【讨论】:

    【解决方案2】:

    你的内部类是静态的。这意味着它们就像外部类一样,并且它们类型的对象可以在不需要父对象的情况下进行初始化。所以这里的父对象永远不会被初始化,它们的静态初始化块也不会被执行。

    【讨论】:

      【解决方案3】:

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

      UPD.:解释。您的代码导致了Out.snOut 类的初始化,但这不是Out 类初始化的原因。

      【讨论】:

        猜你喜欢
        • 2011-01-26
        • 1970-01-01
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        • 2016-09-12
        • 1970-01-01
        • 1970-01-01
        • 2012-01-01
        相关资源
        最近更新 更多