2

非パブリック クラス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
4

3 に答える 3

3

JLS 8.1.3による

宣言が静的コンテキストで発生する内部クラスIのインスタンスには、字句的に囲んでいるインスタンスはありません。

あなたのコードでは、静的なクラスsnにアクセスしようとしているため、仕様に従って囲んでいるクラスはありません。それが、囲んでいるクラスの静的ブロックが実行されていない理由です。

于 2013-01-04T19:57:13.650 に答える
1

実際、あなたのコードでは、クラス自体を使用していませんOut。これが原因で、Java がそれを初期化せず、静的セクションを呼び出さなかった理由です。

UPD .: 説明。あなたのコードはクラスの初期化につながりますがOut.snOut、これはクラスの初期化の原因ではありませんOut

于 2013-01-04T19:53:19.170 に答える
1

内部クラスは静的です。これは、それらが外部クラスと同様であることを意味し、その型のオブジェクトは親オブジェクトを必要とせずに初期化できます。したがって、ここでは親オブジェクトは決して初期化されず、それらの静的初期化ブロックは実行されません。

于 2013-01-04T19:56:15.663 に答える