Java 8:接口成员的可访问性

时间:2014-04-04 18:24:36

标签: java java-8 jls

辅助

Java 8 Says:

  

界面 缺少访问修饰符 的所有成员都是隐式公开的

Java 7 says:

  

接口的所有成员都是隐式公开的。

当我尝试使用代码时:

public interface Test {
    protected int i = 10;
}

编译,我得到了

Test.java:3: error: modifier protected not allowed here
        protected int i = 10;
                      ^

Java版本: Java(TM) SE Runtime Environment (build 1.8.0-b129)

但是在上面的Interface成员声明中我 不缺少访问修饰符 那么为什么我会收到此错误。

3 个答案:

答案 0 :(得分:7)

您引用的内容位于Determining Accessibility with Names

的JLS部分
  

缺少访问修饰符的接口的所有成员都是隐式公开的

您真正需要关注的是interface field declarations中指出

的部分
ConstantDeclaration:
    {ConstantModifier} UnannType VariableDeclaratorList ;
ConstantModifier:
    Annotation public 
    static final

  

接口主体中的每个字段声明都是隐式的   publicstaticfinal。允许冗余指定任何   或者所有这些领域的修饰语。

所以这些是你可以使用的修饰符。您在上面引用的部分指的是您何时不使用任何访问修饰符,在这种情况下,它将隐式public

答案 1 :(得分:0)

界面应该是指你能从课堂外看到的东西"。添加非公共变量或方法是没有意义的。因此,接口不允许受保护的变量或方法。

答案 2 :(得分:0)

JLS 8第9.3,9.4和9.5节中的以下短语未从JLS 7更改:

  

接口主体中的每个字段声明都是隐式的public,static和final。

     

接口正文中的每个方法声明都是隐式公开的。

     

接口中的成员类型声明是隐式公共和静态的。

我认为这涵盖了所有内容,因此似乎没有必要在6.6.1中添加“缺少访问修饰符”,除非他们想要明确表示具有public访问修饰符的成员是明确公开而不是隐式公开。 (并不是说我知道有任何重大差异。)

无论如何,在阅读语言规范时必须非常小心。我可以看到在6.6.1的变化中只有 的人如何得出结论,意图是放宽规则。但事实并非如此。事实是引用的短语9.3,9.4和9.5仍然适用,6.6.1中的措辞变化并不能取代。语言规范必须以正式和数学方式编写,因此查看一个小部分或一个小部分中的一个更改并不总是正确的,并从中得出结论。你真的必须知道整个规范说什么,以及规范的其他部分与问题有关,这可能很困难。