1

次のコードを検討してください。

class New {
    id = 2;
    int id = 7;
}

宣言されていない変数を初期化しようとすると、明らかにコンパイルされません。

ただし、ステートメントを初期化ブロックに入れると、正常にコンパイルされます。

class New {
    { id = 2; }
    int id = 7;
}

この宣言前の初期化を有効にする初期化ブロックのこの「機能」は何ですか?

質問をする前に、SO の初期化ブロックに関するいくつかの投稿を読みましたが、それらは主に初期化の順序に関する問題 (静的と非静的など) に対処しているようです。

4

1 に答える 1

2

ポイントはid = 2;、初期化ブロックに入れることができるステートメントであるということです。

最初のコードは、宣言の順序が原因で違法ではありませんが、コード ブロック外のステートメントを使用できないためです。これも失敗します:

class New {      
    int id = 7;
    id = 2;
}

インスタンス変数の宣言は、クラスのどこにでも記述できます。初期化ブロックとはまったく関係ありません。

たとえば、コードは次と同等です

class New {
    New() { id = 2; }
    int id = 7;
}

あなたの質問によると、宣言の前に初期化が行われるため、これも違法です。

混乱する場合は、クラスの先頭で常にインスタンス変数を宣言するという規則に慣れてください。

于 2018-12-27T11:29:38.827 に答える