1. ホーム
  2. java

[解決済み] Javaです。<init>と<clinit>の違いは何ですか?

2022-02-14 19:06:12

質問

以下の文章が理解できないのですが...。という意味でしょうか? <clinit> は空のコンストラクタ用ですか?なぜ2つの異なるバージョンを持つことが重要なのですか?

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html

2.9. Special Methods

Java仮想マシンのレベルでは、すべてのコンストラクタ (2.12節) は、インスタンスの初期化メソッドとして現れ 特別な名前 <init> . この名前は、コンパイラによって提供される。なぜなら 名前 <init> は有効な識別子ではないので、直接使用することはできません。 で書かれたプログラムです。インスタンス 初期化メソッドは、Java仮想環境内でのみ呼び出すことができます。 マシンで、invokespecial命令によってのみ呼び出すことができます。 を初期化されていないクラスインスタンスに適用します。インスタンス初期化メソッド の元となるコンストラクタのアクセス権 (§2.7.4) を引き受けます。 が導き出された。

クラスまたはインタフェースは、最大で1つのクラスまたはインタフェース初期化メソッドを持ち、そのメソッドを呼び出すことで初期化 (§2.17.4) されます。 メソッドを使用します。クラスまたはインターフェースの初期化メソッドは静的です。 であり、引数を取らない。これは特別な名前 <clinit> . この名前は はコンパイラから提供されます。なぜなら <clinit> は有効な で書かれたプログラムでは、直接使用することはできません。 Java プログラミング言語 クラスとインタフェースの初期化メソッド は、Java仮想マシンによって暗黙のうちに呼び出されます。 Java仮想マシンの命令から直接呼び出されるのではなく は、クラスの初期化処理の一部として間接的にのみ呼び出されます。

解決方法は?

<init> は、インスタンスのコンストラクタ(またはその一つ)であり、非静的フィールドの初期化です。

<clinit> はクラスの静的初期化ブロックであり、静的フィールドの初期化です。

class X {

   static Log log = LogFactory.getLog(); // <clinit>

   private int x = 1;   // <init>

   X(){
      // <init>
   }

   static {
      // <clinit>
   }

}