2013-01-04 3 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

Ah. Понимаю. Создание нового экземпляра в основном методе делает выполнение блока. Спасибо – Mob

+0

Разница, почему 'Out' не загружается, а' staticNested' - потому, что main находится в 'staticNested', это как бы автонагрузки, как вы ожидали. – jn1kk

ответ

2

В соответствии с JLS 8.1.3

экземпляр внутреннего класса я, чье объявление происходит в статическом контексте имеет нет лексически не ограждающих экземпляры.

В вашем коде вы пытаетесь получить доступ к классу sn, который является статическим, поэтому он не будет иметь классов-оболочек согласно спецификации. Вот почему статический блок закрывающих классов не выполняется.

1

На самом деле в своем коде вы не использовали класс Out ею самостоятельно. Это причина, почему Java не инициализировал ее и не вызывал ее статический раздел.

UPD .: Пояснение. Ваш код приводит к инициализации класса Out.snOut, но это не является причиной для класса инициализации Out.

1

Ваши внутренние классы являются статическими. Это означает, что они похожи на внешние классы, и объект их типа может инициализироваться без необходимости родительского объекта. Таким образом, здесь родительские объекты никогда не инициализируются и их статические инициализирующие блоки не выполняются.

Смежные вопросы