pea*_*kit 94 java static final interface language-implementation
我只是想了解为什么在接口定义的所有域都默认static
和final
.保持字段的想法static
对我来说是有道理的,因为你不能拥有接口的对象,但为什么它们final
(隐含地)?
任何人知道为什么Java的设计者在接口使得场去static
和final
?
Adr*_*ter 123
接口不能具有行为或状态,因为它仅用于指定交互合同,而不是实现细节.不允许方法/构造函数体或静态/实例初始化块强制执行任何行为.仅通过允许静态final字段来强制执行状态.因此,Class可以具有状态(静态),但实例状态不是由接口推断的.
BTW:Java中的常量由静态final字段定义(按照惯例,名称使用UPPER_CASE_AND_UNDERSCORES).
小智 27
出生的原因 final
如果未将字段定义为final,则任何实现都可以更改字段的值.然后他们将成为实施的一部分.接口是纯规范,没有任何实现.
出生的原因 static
如果它们是静态的,则它们属于接口,而不是对象,也不属于对象的运行时类型.
Jes*_*ick 17
这里有几点隐藏:
仅仅因为接口中的字段是隐式静态final并不意味着它们必须是编译时常量,甚至是不可变的.你可以定义例如
Run Code Online (Sandbox Code Playgroud)interface I { String TOKEN = SomeOtherClass.heavyComputation(); JButton BAD_IDEA = new JButton("hello"); }
(请注意,在注释定义中执行此操作可能会混淆javac,这与上面实际编译为静态初始化程序的事实有关.)
此外,这种限制的原因比技术更具风格,很多人都希望看到它放松.
这些字段必须是静态的,因为它们不能是抽象的(就像方法一样).因为它们不能是抽象的,所以实现者将无法在逻辑上提供字段的不同实现.
我认为,这些字段必须是最终的,因为许多不同的实现者可以访问这些字段,这使得它们可以更改可能会出现问题(如同步).还要避免重新实现(隐藏).
只是我的想法.