-3

このプログラムがどのように動作しているか説明してください。

class A
{
    //public static String name = "asdf";

    public static final String name = "asdf";

    static {
        System.out.println("static block inside A");
    }

    {
        System.out.println("regular code block");
    }
}

public class tt 
{   
    public static void main(String ar[])
    {
        System.out.println(A.name);
        //A a = new A();
    }
}
  1. 上記のプログラムの実行中に、次のような出力が得られました - asdf
    Qns : コード ブロックが実行されないのはなぜですか?

  2. 非最終的な静的変数名のコメントを外し、最終的な静的変数のコメントを 外すと、A asdf Qns内の静的ブロックとして出力が得られます: 通常のコード ブロックが実行されないのはなぜですか?

  3. System.out.println(A.name); にコメントすると A a = new A(); のコメントを外します。クラス tt で、出力を次のように取得しました - 通常のコード ブロックQns内の静的ブロック : ここでは、両方のブロックが実行されています。しかし、静的ブロックと通常のブロックの違いは何ですか?


4

1 に答える 1

3
  1. name定数式static final Stringを値として持つため、 の本体は次のように効率的にコンパイルされます。tt.main

    System.out.println("asdf");
    

    ... への参照の痕跡がないA.nameためA、初期化されません。

  2. 「通常の」コード ブロックはインスタンス初期化子です。のインスタンスを作成するときにのみ実行されますa

  3. はい、その時点で のインスタンスを作成しているAため、静的初期化子インスタンス初期化子の両方が実行されます。静的初期化子は 1 回だけ実行されます。インスタンス初期化子は、インスタンスを作成するたびに実行されます。

各用語の Java 言語仕様の詳細については、上記のリンクをたどってください。

于 2012-12-11T20:57:42.570 に答える