問題解決

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を出力します。

おすすめ

転載: blog.csdn.net/qq_37669050/article/details/100712142