【问题标题】:why compiler says a public static field in interface is "final" although it is not为什么编译器说接口中的公共静态字段是“最终的”,尽管它不是
【发布时间】:2013-10-14 01:10:09
【问题描述】:

请看下面的代码——

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

为什么?

【问题讨论】:

  • 接口中的所有字段默认为public static final,就像所有方法默认为public abstract一样。
  • @PeterLawrey,从 Java 8 开始,方法可以有 default 实现(非abstract)。请参阅:journaldev.com/2389/…。 (也允许使用 static 方法)。
  • @Mir-Ismaili 在 Java 1 到 18.3 中,方法的默认修饰符是 public abstract,但是如果您将 default 作为关键字添加到 Java 8 的方法中,您可以给它一个 public 默认 实现;)Java 9 允许将private 方法添加到接口中。

标签: java interface static


【解决方案1】:

关于:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      在接口中声明的变量在java中默认总是public static final。接口变量是静态的,因为 Java 接口不能单独实例化;变量的值必须在不存在实例的静态上下文中分配。 final 修饰符确保分配给接口变量的值是一个真正的常量,程序代码不能重新分配。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-03
          • 2012-05-27
          • 2012-01-06
          • 1970-01-01
          • 2011-03-17
          • 2011-01-26
          • 1970-01-01
          相关资源
          最近更新 更多