jvm-Javaにおけるinitとclinitの違いについて説明します。


initとclinitの違い
①initとclinitの方法では実行タイミングが異なります。
initは対象コンストラクタ方法であり、つまりプログラムがnewのオブジェクトに対してそのオブジェクト類のconstructorメソッドを呼び出す時のみinit方法を実行し、clinitはクラスビルダー方法、つまりjvmでクラスローディング――C検証――C初期化を行い、中の初期化段階でjvmはclinit方法を呼び出す。
②initとclinitの方法は目的が異なります。
init is the(or one of the)constructor(s)for the instance,and non-static field initiazation.
clinit are the static initiazation blocks for the class,and static field initialization.
上記の2つはStock Overflow上の解析で、initはinstanceの実例的なコンストラクタであり、非静的変数解析初期化であるのに対し、clinitはclass類コンストラクタで静的変数、静的コードブロックを初期化する。下のこのプログラムを見ればよく分かります。

class X {
  static Log log = LogFactory.getLog(); // <clinit>
  private int x = 1;  // <init>
  X(){
   // <init>
  }
  static {
   // <clinit>
  }
}
clinit詳細
準備段階では、変数はシステムによって要求される初期値を割り当てられていますが、初期化段階では、プログラマがプログラムによって制定された主観的計画に従ってクラス変数と他のリソースを初期化したり、別の角度から表現したりできます。初期化段階はクラスビルダー<clinit>()方法を実行するプロセスです。
①<clinit>()メソッドは、コンパイラが自動的にクラス内のすべてのクラス変数の割当動作とスタティックステートメントブロック(static{}ブロック)のステートメントを統合して生成したもので、コンパイラが収集する順序は、ステートメントがソースファイルに現れる順序によって決定されます。スタティックステートメントブロックでは、スタティックステートメントブロックの前に定義された変数にしかアクセスできません。その後の変数を定義します。前の静的なステートメントブロックには値が割り当てられますが、次のコードにはアクセスできません。

public class Test{
static{
i=0;//             
System.out.print(i);//        "      "
}
static int i=1;
}
②仮想機会保証は、サブクラスの<clinit>()メソッドが実行される前に、親タイプの<clinit>()メソッドが実行されました。したがって、仮想マシンで最初に実行される<clinit>()方法のクラスは、java.lang.Objectに違いない。親類の<clinit>()の方法が先に実行されるので、親類で定義されている静的な語句ブロックは、サブクラスの変数割当値より優先して動作することを意味し、フィールドBの値は、次のコードのうち2であり、1ではない。

static class Parent{
  public static int A=1;
  static{
  A=2;}
  static class Sub extends Parent{
  public static int B=A;
  }
  public static void main(String[]args){
  System.out.println(Sub.B);
  }
}
③インターフェースでは静的なステートメントブロックは使用できませんが、変数初期化のための割当動作が残っていますので、インターフェースはクラスと同じように<clinit>()方法を生成します。ただし、インターフェースとクラスが異なるのは、インターフェースの<clinit>()を実行する方法が、親インターフェースの<clinit>()を先に実行する必要はないということです。親インターフェースで定義された変数が使用される場合のみ、親インターフェースが初期化されます。また、インターフェースの実現類は、初期化時もインターフェースの<clinit>()方法を実行しないようにします。
注意:インターフェースの属性はすべてstatic finalタイプの定数ですので、準備段階では初期化されています。
以上の詳細はjvm-Javaにおけるinitとclinitの違いは小編集が皆さんに共有している内容の全部です。参考にしてもらいたいです。どうぞよろしくお願いします。