请参阅以下代码 -
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
为什么?
答案 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
。