89
class Test {
    public static void main(String arg[]) {    
        System.out.println("**MAIN METHOD");
        System.out.println(Mno.VAL); // SOP(9090);
        System.out.println(Mno.VAL + 100); // SOP(9190);
    }

}

class Mno {
    final static int VAL = 9090;
    static {
        System.out.println("**STATIC BLOCK OF Mno\t: " + VAL);
    }
}

staticクラスがロードされたときにブロックが実行されたことを知っています。ただし、この場合、クラス内のインスタンス変数Mnoはです。finalそのため、staticブロックは実行されていません。

どうしてこんなことに?そして、私が削除した場合、それはうまくいきfinalますか?

static final変数とstaticブロックのどちらのメモリが最初に割り当てられますか?

アクセス修飾子が原因finalでクラスがロードされない場合、変数はどのようにしてメモリを取得できますか?

4

5 に答える 5

1
  1. 実際には、その Mno クラスを拡張していないため、コンパイルの開始時に変数 VAL の定数が生成され、実行の開始時にその変数が必要なときにメモリからロードされます。したがって、静的ブロックが実行されないようにクラスを参照する必要はありません。

  2. クラスがクラスをA拡張する場合Mno、静的ブロックはクラスに含まれAます。これを行うと、その静的ブロックが実行されます。例えば..

    public class A extends Mno {
    
        public static void main(String arg[]){    
            System.out.println("**MAIN METHOD");
            System.out.println(Mno.VAL);//SOP(9090);
            System.out.println(Mno.VAL+100);//SOP(9190);
        }
    
    }
    
    class Mno {
        final static int VAL=9090;
        static {
            System.out.println("**STATIC BLOCK OF Mno\t:"+VAL);
        }
    }
    
于 2013-06-06T05:12:48.750 に答える
0

私の知る限り、登場順に実行されます。例えば ​​:

 public class Statique {
     public static final String value1 = init1();

     static {
         System.out.println("trace middle");
     }
     public static final String value2 = init2();


     public static String init1() {
         System.out.println("trace init1");
         return "1";
     }
     public static String init2() {
         System.out.println("trace init2");
         return "2";
     }
 }

印刷します

  trace init1
  trace middle
  trace init2

私はそれをテストしたところ、クラス「Statique」が実際に使用され、別のコードで「実行」されたときに静的が初期化されます(=>印刷)(私の場合は「new Statique()」を実行しました。

于 2013-05-31T09:23:47.770 に答える