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 是最终的——


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

根据JLS 9.3 接口字段(常量)声明

接口主体中的每个字段声明都是隐式公共的、静态的和最终的。允许为这些字段冗余地指定任何或所有这些修饰符。

于 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 回答
0

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

仅供参考,您不能static在接口中声明方法。您可以在这个 SO question 中找到原因。 但是,您可以Inner Class在可以包含static方法以及非静态和非最终变量的接口中声明。

于 2014-01-13T10:27:15.547 回答