为什么接口中的所有字段都是隐式静态和最终的?

我只是试图理解为什么接口中定义的所有字段都是隐式和.保留字段的想法对我来说是有意义的,因为你不能有一个界面的对象,但为什么它们是(隐含的)?staticfinalstaticfinal

任何人都知道为什么Java设计人员在界面中制作字段和?staticfinal


答案 1

接口用于指定交互协定,而不是实现详细信息。开发人员应该能够通过查看接口来使用实现,而不必查看实现它的类内部。

接口不允许您创建它的实例,因为您无法指定构造函数。因此,它不能具有实例状态,尽管接口字段可以定义常量,这些常量是隐式静态和最终的。

您无法在接口中指定方法主体或初始值设定项块,尽管从 Java 8 开始,您可以使用 body 指定缺省方法。此功能旨在允许将新方法添加到现有接口,而无需更新所有实现。但是,如果不首先创建实现接口的实例,您仍然无法执行此类方法。

旁注:请注意,您可以使用匿名内部类实现接口:

interface Foo {
    String bar();
}

class FooBar {
    Foo anonymous = new Foo() {
         public String bar() {
             return "The Laundromat Café";
    };
}

您必须提供接口的完整实现,以便匿名内部类进行编译。

new Foo()正在使用其默认构造函数初始化匿名内部类。


答案 2

最终的原因

如果未将字段定义为 final,则任何实现都可以更改字段的值。然后,它们将成为实施的一部分。接口是没有任何实现的纯规范。

静态的原因

如果它们是静态的,则它们属于接口,而不是对象,也不属于对象的运行时类型。


推荐