2016-04-06 14 views
3

私はJavaでさまざまなタイプの変数の初期化を実験していました。コンストラクタで最終変数(final int bなど)と静的変数(static int Cなど)を初期化できますが、コンストラクタでstatic final変数(static final int dなど)を初期化できません。 IDEにもエラーメッセージが表示されます。なぜJavaがコンストラクタ内のstatic final変数(static final int dなど)の初期化を許可しないのですか?

なぜJavaがコンストラクタでstatic final変数の初期化を許可しないのですか?

public class InitialisingFields { 
    int a; 
    final int b; 
    static int c; 
    static final int d; 

    InitialisingFields(){ 
     a = 1; 
     b = 2; 
     c = 3; 
     d = 4; 
    } 

    public static void main(String[] args) { 
     InitialisingFields i = new InitialisingFields(); 
    } 

} 

エラーメッセージ:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - cannot assign a value to final variable d 
    at JTO.InitialisingFields.<init>(InitialisingFields.java:22) 
    at JTO.InitialisingFields.main(InitialisingFields.java:26) 
Java Result: 1 

答えて

5

静的変数はクラスのすべてのインスタンスで共有されるため、クラスのインスタンスを作成するたびに同じ変数が再度割り当てられます。それは最終的なものなので、一度しか割り当てられません。したがって、許可されていません。

static final変数を1回だけ割り当てることを保証する必要があります。したがって、宣言されているのと同じ式で割り当てることも、一度だけ実行される静的イニシャライザブロックで割り当てることもできます。

+0

ありがとう!今はすべてが理にかなっています! – Thor

0

あなたはfinalフィールドを再割り当てすることはできません。最終的に変数を変更することはできません。最後を削除して、あなたは大丈夫です。

+0

Nope。それは答えではありません。 – TheLostMind

+0

@ TheLostMind実際には、エラーメッセージの原因はまさにその通りです。 – Biffen

+0

@Biffen - 'static final'フィールドは' static'ブロックで初期化することができ、インスタンスレベルの最終フィールドはインスタンスレベルのブロックまたはコンストラクタで初期化することができます。これはフィールドの 'final'プロパティとは関係ありません。答えは、フィールドが「静的」であるという事実を含むべきである。 – TheLostMind

3

  1. 静的変数は、クラスのインスタンスを作成し、それをコンストラクタ外に起こらなければならないかどうかを設定しなければならないからです。
  2. これは一度しか設定できないため、インスタンスを2回作成するときにその値を変更することはできません。

それが初期化される前に、静的最終変数を読み取ることができ、その値は、例えば、タイプのデフォルト値になります

class Nasty { 
    static final int foo = yuk(); 
    static final int bar = 1; 

    static int yuk() { 
    System.out.println(bar); // prints 0. 
    return 99; 
    } 
} 

しかし、これは奇妙なケースですが、ほぼ確実には望ましくありません。

+0

静的なint型であるため、インスタンスが作成される前でもこの変数を0に初期化しませんか? – Berger

+1

割り当てられる前に読むことができ、その値は0になります。しかし、それは奇妙なケースであり、ほぼ確実に望ましくありません。 –

関連する問題