Java Docs说接口不能有字段。为什么?

时间:2014-05-20 13:09:04

标签: java interface

我正在阅读this并明确指出One significant difference between classes and interfaces is that classes can have fields whereas interfaces cannot.这怎么可能,因为Java Docs也说all fields in interface are public,static and final

3 个答案:

答案 0 :(得分:5)

  

这怎么可能,因为Java Docs还说接口中的所有字段都是publicstaticfinal

来自Java Language Specification. Chapter 9. Interfaces. 9.3. Field (Constant) Declarations(强调我的):

  

界面正文中的每个字段声明都是隐式 publicstaticfinal。允许为这些字段冗余地指定任何或所有这些修饰符。

     

如果两个或多个(不同的)字段修饰符出现在字段声明中,则通常(尽管不是必需的)它们的显示顺序与上面ConstantModifier的制作中显示的顺序一致。

这意味着界面中的每个字段都将被视为public常量字段。如果您添加publicstaticfinal或其中一些修饰符,或者都不添加,编译器将为您添加它们。这就是含蓄的含义。

所以,有了这个:

interface Foo {
    String bar = "Hello World";
}

类似于

interface Foo {
    public String bar = "Hello World";
}

这类似于

interface Foo {
    static bar = "Hello World";
}

这三个接口将编译为相同的字节码。

另外,请确保界面中的字段声明遵循子注释。这意味着,您无法缩小界面中字段的可见性。这是非法的:

interface Foo {
    //compiler error!
    private String bar = "Hello World";
}

因为bar不是public而且它违反了界面中字段的标准定义。

答案 1 :(得分:3)

static final字段是一个常量值,它存在于类本身中,而不是在类的实例中。接口的实例不能有任何字段,即使接口本身可能,甚至接口本身也只限于定义常量。

答案 2 :(得分:2)

使用object创建new时,所有fields都会初始化为其值或默认值。 由于您无法实例化interface,因此您无法拥有任何fields。 但您可以在constants中使用interface,这就是为什么默认情况下所有fields都为public static final

请参阅jls