public class Test
{
public static Test t1 = new Test();
{
System.out.println("blockA");
}
static
{
System.out.println("blockB");
}
public static void main(String[] args)
{
Test t2 = new Test();
}
}
回答案:blockA blockB blockA
最初の違いは、クラスの初期化、インスタンスの初期化です
クラス読み込み準備段階->クラス初期化clinit段階
クラスローディングの準備段階:変数にはシステムに必要な初期値(0またはnullなど)が割り当てられ、最終変数にはこの時点でユーザー定義の初期値が割り当てられます
クラス初期化プロセス:
ステップ1コンパイラは、t1、静的ステートメントブロック、メインメソッドステートメントブロックの割り当てアクションを収集します
ステップ2収集されたステートメントブロックを実行します。
ステップ2.1t1 = new Testを実行し、clinitプロセスが呼び出されていることを確認します。これにより、initプロセスのトリガーを開始し、メンバー変数(ここではありません)と非静的コードブロックの初期化を実行し、blockAを出力し、最後にコンストラクター(ここではありません)を呼び出すことができます。 )
ステップ2.2順序に従って、静的ステートメントブロックと出力ブロックBを実行します
ステップ2.3順序に従って、mainメソッドステートメントブロックを実行し、t2 = new Testを実行し、initメソッドをトリガーし、非静的コードブロックを実行し、blockAを出力します。