接口中的字段

2022-08-31 12:51:55

我在Java中有一个基本问题,但这是OOP中的一个一般问题。为什么接口允许设置字段?这难道不是与接口应该做的事情背道而驰吗?

我理解它的方式是,界面在英语中是一个形容词。因此,如果我的类实现了 Runnable 和 Serializable 接口,我将向用户保证我的类将满足可运行和可序列化的条件。但是,这意味着接口是“无状态的”,但它们被允许在Java中具有字段。

我错过了什么吗?


答案 1

接口中的所有字段都是 ,即它们是常量。public static final

通常建议避免使用此类接口,但有时您可以找到一个没有方法且仅用于包含常量值列表的接口。


答案 2

首先,Java中的OOP范式OOP实现之间存在差异,因此相同的单词可能意味着一些不同的东西。

在 OOP 中,范式接口是您可以对对象执行的操作(或者对象可以为您执行的操作)。任何对象都可以有多个接口,因此扮演不同的角色。例如,某人可能担任程序员并能够创建程序,但同时他可能是丈夫和父亲,因此能够为家庭支付账单并照顾孩子。这里的“程序员”,“丈夫”和“父亲”是接口,人是实现它们的对象。请注意,接口并不意味着存在用于实现对象的任何特定功能(字段),只是此对象应该能够执行的操作。

Java或多或少遵循这个想法,但作为任何范式实现都有自己的功能。Java允许描述方法,即实现对象应该能够执行的操作,但不允许任何实现细节,因此,与对象字段或私有方法无关。

但是常量(字段)呢?它们是实现的一部分还是接口的一部分。两者都可以。例如,接口“程序员”可以将常量设置为“8”。因此,Java也允许您在接口中描述常量。public final staticWORK_HOURS

请注意,Java只能帮助你做出好的OOP设计,但它并不强烈要求它。特别是,并非所有对象的公共方法也应该存在于接口中。例如,getter 和 setter 方法通常是公共的,但实际上它们是实现的一部分,而不是接口,因此值得不要将它们引入接口。

(另请注意,我在这里描述的大多数事情都是关于主流OOP的,就像Java一样,但也有其他类型的OOP,例如基于原型的OOP,特别是在JavaScript中实现)。