0

私はJAVAの初期化プロセスについていくつかの研究を行っています。参考資料は次のとおりです 。JVMでクラスがロードされて初期化されるとき

このページには次のルールがあります: 3) 静的フィールドへのアクセスが原因でクラスの初期化がトリガーされた場合、静的フィールドを宣言したクラスのみが初期化され、静的フィールドが参照されてもスーパークラスまたはサブクラスの初期化はトリガーされません。サブクラス、サブインターフェースのタイプ別、またはインターフェースの実装クラス別。

私は本当にその考えを理解していません。静的フィールドがサブ クラスによって参照される場合、このフィールドはもちろんサブ クラス オブジェクトを作成するか、サブ クラス オブジェクトによって割り当てられる必要があります。したがって、間違いなく Sub クラスの初期化がトリガーされます。

私の解釈の何が問題になっていますか?


編集

  1. スーパークラスの静的初期化をトリガーします。
  2. static フィールドが final で、宣言時に static final フィールドが初期化される場合。この static final フィールドはコンパイル時の定数値であるため、クラスのロードも初期化も行いません。注意: static final フィールドが static ブロックで初期化された場合、このステートメントは保持されなくなります。
4

3 に答える 3

3

ポイントは、次のような状況であると思います。

public class Superclass {
    public static long INIT_TIME = System.currentTimeMillis();

    static {
        System.out.println("Initializing Superclass");
    }
}

public class Subclass extends Superclass {
    static {
        System.out.println("Initializing Subclass");
    }
}

このコード:

long time = Subclass.INIT_TIME;

実際には次のようにコンパイルされます。

long time = Superclass.INIT_TIME;

ソースコードが参照されていても、「スーパークラスの初期化」のみSubclassが出力されます。

于 2013-04-30T16:34:21.730 に答える
0

上記のように、スーパークラス/サブクラスの例を実行すると、Subclass.INIT_TIME の呼び出し時に、スーパークラスとサブクラスの両方の静的初期化子が呼び出されます。

ただし、ここでは「Initializing Superclass」のみが出力されると言われています。誰かが明確にすることができますか?

于 2014-11-02T14:54:15.640 に答える
0

例:

class A {
   public static int nA = 0;
}

class B extends A {
   public static int nB = 1;
}

class C extends B {
   public static int nC = 2;
}

クライアント:

int test = B.nA;

JVM はクラス A のみを初期化します。B も C も初期化しません。

于 2013-04-30T16:34:31.970 に答える