接口中的变量

为什么接口中使用的变量是PUBLIC STATIC FINAL? 为什么特别是“静态”?

在接口中声明的字段无论如何都只能是常量,那么为什么它取决于您使用哪个实例来访问它?

无论如何,将字段放在接口中通常都是糟糕的风格。 该接口旨在反映实现它的类的function – 这与常量的概念完全正交。 使用接口来声明一堆常量当然是一个令人讨厌的想法。 我偶尔会发现使接口类型公开常量是简单的实现很有用 – 例如,过滤接口可能有“ALLOW_ALL”和“ALLOW_NONE”字段。

我想你可以设想一个实现接口实际上为你的类添加一个实例字段的场景 – 但这不仅会破坏封装,而且还会隐含公开,而且还要通过指定部分实现而不是API。

因为您无法实例化接口。 也没有任何方法体可以使用非静态非最终变量。

为什么不是静止的?

它是与接口关联的常量,而不是与其任何特定实例相关联的常量。

我猜的主要原因是VM /语言的实现细节。

如果不允许接口具有非静态变量,则在创建类时不需要为接口分配内存。 如果inheritance具有相同名称的变量,也不需要特殊的命名/重命名机制。 您唯一需要的是在使用接口时调用正确函数的表。

简而言之 – 它使语言/ VM维护者的生活变得更容易。 如果你真的想看看多重inheritance及其陷阱和陷阱,请阅读Bertrand Meyer的“面向对象软件构建”(第2版)。 然后你就会明白为什么界面需要如此简单(并且存档了多重inheritance的大部分内容)。

接口是定义对象之间交互 的契约

此交互由公开的方法定义,而不是由变量定义。 变量只能描述内部工作,而不是交互。

请注意,变量不应该用于交互。 根据封装的OOP原则,让1个类直接访问另一个类的变量是一种犯罪行为。

常量(例如Math.PI )是唯一可接受的例外。 由于常量是唯一可以在不违反封装原则的情况下由其他类直接访问的变量,因此接口中的所有变量都被视为public static final变量(即常量)