2

派生クラスを実行すると、派生と親が出力されます.静的ブロックの継承を防ぐ方法はありますか?

// クラス 1

public class parent {
static {
      System.out.println("Parent");
}
}

//クラス2

public class derived extends parent{
      static {
            System.out.println("derived");
      }

      public static void main(String [] args) {

      }
}

基本的に、継承したい親クラスにいくつかのメソッドがありますが、派生クラスがインスタンス化されているときに親静的ブロックで発生している処理が発生することは望ましくありません。.これを行う方法はありますか、それともコードを複製する必要がありますか?

4

2 に答える 2

10

番号。それをしてはいけない 。静的初期化ブロックは継承されません。基本クラスはスーパークラスを拡張するため、クラスがロードされると静的ブロックが実行されます。クラスを参照するときにスーパークラス定義でさえもJVMによってロードされます。

JLS 12.4.1に従って:

初期化が発生する場合 クラスまたはインターフェイス型 T は、次のいずれかが最初に発生する直前に初期化されます。

• T はクラスであり、T のインスタンスが作成されます。

• T はクラスであり、T によって宣言された静的メソッドが呼び出されます。

• T によって宣言された static フィールドが割り当てられます。

• T によって宣言された static フィールドが使用され、そのフィールドは定数変数ではありません (§4.12.4)。

• T は最上位クラス (§7.6) であり、T (§8.1.3) 内に語彙的にネストされた assert ステートメント (§14.10) が実行されます。

于 2013-06-19T07:47:32.280 に答える
1

不可能です。クラスのロード中に静的ブロックが実行されており、静的ブロックを使用しないように親クラスをリファクタリングしない限り、これを防ぐことはできません

于 2013-06-19T07:46:59.293 に答える