辅助
界面 缺少访问修饰符 的所有成员都是隐式公开的
接口的所有成员都是隐式公开的。
当我尝试使用代码时:
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
成员声明中我 不缺少访问修饰符 那么为什么我会收到此错误。
答案 0 :(得分:7)
您引用的内容位于Determining Accessibility with Names
的JLS部分缺少访问修饰符的接口的所有成员都是隐式公开的
您真正需要关注的是interface field declarations中指出
的部分ConstantDeclaration:
{ConstantModifier} UnannType VariableDeclaratorList ;
ConstantModifier:
Annotation public
static final
和
接口主体中的每个字段声明都是隐式的
public
,static
和final
。允许冗余指定任何 或者所有这些领域的修饰语。
所以这些是你可以使用的修饰符。您在上面引用的部分指的是您何时不使用任何访问修饰符,在这种情况下,它将隐式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中的措辞变化并不能取代。语言规范必须以正式和数学方式编写,因此查看一个小部分或一个小部分中的一个更改并不总是正确的,并从中得出结论。你真的必须知道整个规范说什么,以及规范的其他部分与问题有关,这可能很困难。