public class StaticTest {
private static String a;
private static String b = "this is " + a;
public static void main(String[] args) {
a = "test";
// I think the result is this is test
// but the result is this is null, why?
System.out.println(b);
}
//
// 我本以为输出结果是 this is test
// 没想到输出结果为 this is null, 这是什么原因
}
巴扎黑2017-04-18 10:58:42
まず第一に: A 変数を定義するときは、初期値を割り当てないため、A は NULL になり、次に B が得られます。当然これは null です
次に 2 つ目: public static void main、コンパイラこのコードをコンパイルしています a と b が main 関数によって最初に参照され、a を変更すると、a は変更されますが、b は同じ b のままであり、これは永久に null になります。静的関数を実行するプロセスの意味を理解する必要があります。 B は動的に設定されないため、当然のことながら、取得されるのは静的な b であり、動的にコンパイルされません。
黄舟2017-04-18 10:58:42
これは、JVM のクラス初期化メカニズムについてです。バイトコードを実行オブジェクトに変換する 3 つのプロセスは、ロード、接続、初期化です。 。 。 StaticTest には、JVM の起動時にスタートアップ クラスに設定される main メソッドがあり、アクティブな呼び出しを実行してクラスを初期化し、これらの 2 行のコード private static String を実行するため、接続準備プロセスではデフォルト値 null が与えられます。 a; private static String b = "これは " + a;so b=これは null です