2016-08-24 5 views
-2

保護された最終フィールドをサブクラスのコンストラクタから設定できないのはなぜですか?Java保護された最終フィールドをサブクラスのコンストラクタから設定できないのはなぜですか?

例:

class A { 
    protected final boolean b; 

    protected A() { 
     b = false; 
    } 
} 

class B extends A { 
    public B() { 
     super(); 
     b = true; 
    } 
} 

私はそれはそれはないだろう、いくつかのケースでは意味をなさないと思いますか?

+0

finalフィールドは、コンストラクタでのみ、またはクラスの初期化中に初期化できます。 – ravthiru

答えて

5

これは、最終フィールドの値を変更できないためです。

しかし、あなたは本当に別の値にそれをSEにしたい場合は、あなたが行うことができます:

class A { 
    protected final boolean b; 

    protected A() { 
    this(false); 
    } 
    protected A(boolean b) { 
     this. b = b; 
    } 
} 

class B extends A { 
    public B() { 
     super(true); 
    } 
} 
+1

私はコンストラクタについて話しています。 – stonar96

+0

@ stonar96スーパークラスのコンストラクタを呼び出したときに値 'b'を設定します。サブクラスで異なる値に設定する場合は、その値をスーパークラスのコンストラクタに渡す必要があります。 – user902383

1

finalフィールドの定義は、それが一度だけ割り当てることができるということであるので、それを行うことはできません。 A()に既に保護されたフィールドが割り当てられている場合は、B()に再度割り当てても、コンストラクタで処理が完了していても「1回だけ」違反します。

関連する問題