2013-01-04 82 views
1

非公开类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 
+1

我不认为班级'Out'会被加载。它在您访问其静态字段或静态方法或加载实例时加载。 jn1kk

+0

啊。我懂了。在主要方法中创建一个新实例会使块运行。谢谢 – Mob

+0

为什么'Out'不加载和'staticNested'确实是因为main是在'staticNested'中,它可以像你期望的那样自动加载。 – jn1kk

回答

2

作为每JLS 8.1.3

内部类的实例我其声明发生在静态上下文具有没有词法包围实例

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

1

其实在你的代码中并没有被它自己使用Out类。这是一个原因,为什么Java没有初始化它,并没有调用它的静态部分。

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

1

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