68

Javaがこのコードをどのように実行するかを誰か説明できますか? 各ステートメントを実行する順序を意味します。

public class Foo
{
    boolean flag = sFlag;
    static Foo foo = new Foo();
    static boolean sFlag = true;

    public static void main(String[] args)
    {
        System.out.println(foo.flag);
    }
}

出力:

false
4

5 に答える 5

104
  • クラスの初期化が開始されます。最初fooはnullでsFlagfalseです
  • 最初の静的変数初期化子 ( foo) が実行されます。
    • の新しいインスタンスFooが作成されます
    • 実行用のインスタンス変数初期化子flag- 現在sFlagは false であるため、の値flagは false です
  • 2 番目の静的変数初期化子 ( sFlag) が実行され、値が true に設定されます。
  • クラスの初期化が完了しました
  • mainが実行され、出力されますがfoo.flag、これは false です

sFlagであると宣言された場合、それはコンパイル時の定数finalとして扱われることに注意してください。その時点で、それへのすべての参照は基本的に にインライン化されるため、これも当てはまります。truefoo.flag

于 2012-05-16T07:30:05.683 に答える
12

fooクラスの静的初期化中、sFlag が初期化される前にインスタンス化され、ブール値のデフォルト値は false です。

  1. クラスが読み込まれます
  2. Foo はインスタンスに初期化されます

    2.a インスタンス メンバー フラグは sFlag の値に初期化されます (falseデフォルト) 。

  3. sFlag はtrueに初期化されます

詳細については、 JLS §12.4を参照してください。

于 2012-05-16T07:29:17.320 に答える
5

クラスがロードされ、sFlagフィールドfooが初期化されますが、foo最初に初期化されます!
フィールドflagとフィールドsFlagはブール値で、null にすることはできないため、デフォルトでは false であり、初期化中sFlagも false のままfooです。flag = sFlagこれflagはfalseです。それだけです

于 2012-05-16T07:31:25.387 に答える
1

最初に静的フィールドを実行し、最初にインラインで実行する必要があります! したがって、最初に4行目、次に5行目が実行されるため、fooが最初に初期化され、ブール変数はデフォルトでfalseに初期化されることがわかっているため、最初にfooが初期化されると、フラグのフィールドはfalseであるsflagになり、次にsfalsgがtrueになります。フラグを変更しません(関係はありません)。最後にメインが実行され、false である falg が出力されます!!! お役に立てれば幸いです!成功する

于 2012-05-23T07:42:33.463 に答える