为什么编译器说接口中的公共静态字段是“最终的”,尽管它不是

时间:2013-10-14 01:10:10

标签: java interface static

请参阅以下代码 -

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 个答案:

答案 0 :(得分: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是最终的 -


但实际上最终是否显式声明它是否是因为它是在接口中声明的。您不能在接口中包含非最终变量(非常量)。无论是否已明确声明它,它也是公共的和静态的。

根据JLS 9.3 Interface Field (Constant) Declarations

  

界面正文中的每个字段声明都是隐式 public,static和final。允许为这些字段冗余地指定任何或所有这些修饰符。

答案 1 :(得分:3)

在java中,在Interfacel中声明的所有变量都是 public static final default

答案 2 :(得分:2)

在java中,默认情况下,接口中声明的变量始终是public static final。接口变量是静态的,因为Java接口本身无法实例化;必须在没有实例的静态上下文中分配变量的值。最终修饰符确保分配给接口变量的值是一个真正的常量,不能由程序代码重新赋值。

答案 3 :(得分:0)

正如所有答案都说默认情况下,Interface中声明的所有变量都是静态最终变量。

仅供参考,您无法在界面中声明static方法。你可以在this SO question.中找到原因 但是,您可以在可以包含Inner Class方法和非静态和非最终变量的接口中声明static