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

pea*_*kit 94 java static final interface language-implementation

我只是想了解为什么在接口定义的所有域都默认staticfinal.保持字段的想法static对我来说是有道理的,因为你不能拥有接口的对象,但为什么它们final(隐含地)?

任何人知道为什么Java的设计者在接口使得场去staticfinal

Adr*_*ter 123

接口不能具有行为或状态,因为它仅用于指定交互合同,而不是实现细节.不允许方法/构造函数体或静态/实例初始化块强制执行任何行为.仅通过允许静态final字段来强制执行状态.因此,Class可以具有状态(静态),但实例状态不是由接口推断的.

BTW:Java中的常量由静态final字段定义(按照惯例,名称使用UPPER_CASE_AND_UNDERSCORES).

  • 最终字段是常数并不一定是真的; 这只是原始类型的保证.通常,final关键字仅表示内存位置不会更改. (53认同)
  • 我没有说最终字段是常量,只是常量是最终字段.请注意,允许在接口中放置非原始静态final字段.即使该字段的内容可能会更改,对它的引用也是不变的. (7认同)
  • 这一定是我的智力下降,但是在看了六年的答案(恰好是我得分最高的答案)之后,我仍然不明白这些言论。请提出其他措辞,因为我看不到任何错误。 (2认同)

小智 27

出生的原因 final

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

出生的原因 static

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


Jes*_*ick 17

这里有几点隐藏:

仅仅因为接口中的字段是隐式静态final并不意味着它们必须是编译时常量,甚至是不可变的.你可以定义例如

interface I {
  String TOKEN = SomeOtherClass.heavyComputation();
  JButton BAD_IDEA = new JButton("hello");
}
Run Code Online (Sandbox Code Playgroud)

(请注意,在注释定义中执行此操作可能会混淆javac,这与上面实际编译为静态初始化程序的事实有关.)

此外,这种限制的原因比技术更具风格,很多人都希望看到它放松.


Naw*_*Man 9

这些字段必须是静态的,因为它们不能是抽象的(就像方法一样).因为它们不能是抽象的,所以实现者将无法在逻辑上提供字段的不同实现.

我认为,这些字段必须是最终的,因为许多不同的实现者可以访问这些字段,这使得它们可以更改可能会出现问题(如同步).还要避免重新实现(隐藏).

只是我的想法.