我正在阅读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
。
答案 0 :(得分:5)
这怎么可能,因为Java Docs还说接口中的所有字段都是
public
,static
和final
。
来自Java Language Specification. Chapter 9. Interfaces. 9.3. Field (Constant) Declarations(强调我的):
界面正文中的每个字段声明都是隐式
public
,static
和final
。允许为这些字段冗余地指定任何或所有这些修饰符。如果两个或多个(不同的)字段修饰符出现在字段声明中,则通常(尽管不是必需的)它们的显示顺序与上面
ConstantModifier
的制作中显示的顺序一致。 子>
这意味着界面中的每个字段都将被视为public
常量字段。如果您添加public
,static
和final
或其中一些修饰符,或者都不添加,编译器将为您添加它们。这就是含蓄的含义。
所以,有了这个:
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