4

以下のコードをご覧ください --

public interface TestInterface {
    public static String NON_CONST_B = "" ; 
}

public class Implemented implements TestInterface {
    public static String NON_CONST_C = "" ;
}

public class AutoFinal  {

    public static String NON_CONST_A = "" ;

    public static void main(String args[]) {
        TestInterface.NON_CONST_B = "hello-b" ;
        Implemented.NON_CONST_C = "hello-c";
        AutoFinal.NON_CONST_A = "hello-a" ;
        Implemented obj = new Implemented();
    }
}

ただし、コンパイラはそれTestInterface.NON_CONST_Bが最終的なものであると不平を言います-

AutoFinal.java:6: error: cannot assign a value to final variable NON_CONST_B
        TestInterface.NON_CONST_B = "hello-b" ;
                 ^
1 error

なぜ ?

4

4 に答える 4

12

それにかんする:

public interface TestInterface {
   public static String NON_CONST_B = "" ; 
}

public class AutoFinal  {    
   public static void main(String args[]) {
      TestInterface.NON_CONST_B = "hello-b" ;
      // ....
   }
}

ただし、コンパイラは TestInterface.NON_CONST_B が final であると不平を言います --


ただし、実際には、インターフェイスで宣言されているため、明示的に宣言するかどうかは最終的なものです。インターフェイスに非最終変数 (非定数) を含めることはできません。また、明示的に宣言されているかどうかに関係なく、パブリックかつ静的です。

JLS 9.3 インターフェイス フィールド (定数) 宣言ごと:

インターフェイス本体のすべてのフィールド宣言は、暗黙的に public、static、および final です。そのようなフィールドに対して、これらの修飾子の一部またはすべてを重複して指定することが許可されています。

于 2013-10-14T01:10:44.347 に答える
3

Java では、Interfacel で宣言されたすべての変数はpublic static final default です

于 2013-10-14T02:07:08.053 に答える
2

インターフェイスで宣言された変数は、Java ではデフォルトで常に public static final です。Java インターフェースはそれ自体ではインスタンス化できないため、インターフェース変数は静的です。変数の値は、インスタンスが存在しない静的コンテキストで割り当てる必要があります。final 修飾子は、インターフェイス変数に割り当てられた値が、プログラム コードによって再割り当てできない真の定数であることを保証します。

于 2013-10-14T03:05:49.303 に答える