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

Java文档说接口不能有字段。为什么?,java,interface,Java,Interface,我正在阅读,它清楚地指出,类和接口之间的一个显著区别是类可以有字段,而接口不能。这怎么可能呢,因为Java文档还说,接口中的所有字段都是公共的,静态和最终静态最终字段是一个常量值,存在于类本身中,而不是类的实例中。接口实例不能有任何字段,即使接口本身可能有,并且即使在接口本身上,您也只能定义常量。当使用new创建对象时,所有字段将初始化为其值或其默认值。 由于不能实例化接口,因此不能有任何字段。 但是在界面中可以有常量,这就是为什么默认情况下所有字段都是public static final 看

我正在阅读,它清楚地指出,
类和接口之间的一个显著区别是类可以有字段,而接口不能。
这怎么可能呢,因为Java文档还说,
接口中的所有字段都是公共的,静态和最终

静态最终
字段是一个常量值,存在于类本身中,而不是类的实例中。接口实例不能有任何字段,即使接口本身可能有,并且即使在接口本身上,您也只能定义常量。

当使用
new
创建
对象时,所有
字段将初始化为其值或其默认值。
由于不能实例化
接口
,因此不能有任何
字段
。 但是在
界面中可以有
常量
,这就是为什么默认情况下所有
字段
都是
public static final

这怎么可能,因为Java文档还说界面中的所有字段都是
公共的
静态的
最终的

来自(我的):

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

如果一个字段声明中出现两个或多个(不同的)字段修饰符,通常情况下(尽管不是必需的),它们的出现顺序与上文为
ConstantModifier
生产中显示的顺序一致

这意味着界面中的每个字段都将被视为
公共
常量字段。如果您添加了
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
,它违反了接口中字段的标准定义。

A
public static final
字段被视为常量。
public static final
不被视为字段,而是作为
static
成员。文档更倾向于将字段称为非静态的内容。@除了
public String x=“abc”
之外,其他都是什么呢?因为当我在界面中声明它时,它不会显示任何编译错误。编译器会为您将其设置为
public static final String x=“abc”
。@Luigimendoza我说得对吗?但是如果我声明
public String x怎么办=java中的abc
。@越新鲜,您将得到编译器错误,因为它不是
最终的
@SajanChandran,您将得到编译器错误,因为它不是最终的false。编译器将为您将其标记为
static final
,类似于在未声明任何构造函数的情况下为类添加默认构造函数。@LuiggiMendoza编译器不会标记
static final
如果您已有任何
修饰符
,则仅当我们声明类似
String x=“abc”时才会添加
@SajanChandran检查你在答案中发布的JLS链接。但是如果我用java声明
public String x=“abc
。你错了,我在我的界面中写了
public String x=“abc
,它仍然没有给我任何错误。你自己试试看。
public String x=“abc”
这是一种合法的语法。只是编译器在您自己不添加的情况下隐式地添加了
静态
。当然,原因是因为你永远不能实例化一个接口,在接口中有一个实例字段是没有意义的。@BHeshGurung和final也是。@BHeshGurung很好,我总是把static和final放在一起,因为我认为这样更清楚,但你是对的。如果你不手动输入,它们是假定的。好吧,现在我完全理解了。谢谢你这么详细的解释。