接口如何覆盖对象类的方法?为什么“Collection”接口重写了 Object 类的 equals(Object o) 方法和 hashCode() 方法?
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collection.html#hashCode()
要覆盖某个类的方法,我们需要扩展该类(即继承的概念进入画面),这是否意味着 java 中的接口扩展(即继承)对象类?
我的理解:
正如我们所知,Java 中的接口不会扩展 Object 类,但是对于 Object 类中的每个公共方法,在每个没有直接超级接口的接口中声明了一个隐式抽象和公共方法。这是标准的 Java 语言规范,它是这样说的,
"如果一个接口没有直接的超接口类型,那么该接口隐式声明了一个签名为s、返回类型为r的公共抽象成员方法m,并抛出每个签名为s、返回类型为r、返回类型为r的公共实例方法m对应的子句t throws 子句 t 在 Object 中声明,除非接口明确声明了具有相同签名、相同返回类型和兼容 throws 子句的抽象方法。”
(参考:https://docs.oracle.com/javase/specs/jls/se17/html/jls-9.html)
但是“集合”接口有一个超级接口(即可迭代)那么它如何覆盖对象类方法?因为它与上述定义相矛盾。
“direct SuperInterface an Interface”与“SuperInterface of an Interface”之间有什么区别吗?因为上面的定义提到了'direct Super Interface'这个词,而Iterable是Collection的SuperInterface。
(参考:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collection.html)
编辑:
非常感谢!@user16320675。但是它想知道通过接口覆盖(即声明)Object 类方法的目的是什么无论如何实现该接口的类将隐式扩展 Object 类,因此该类可以覆盖所需的 Object 类方法?
简而言之:direct superinterface是接口扩展的接口(父接口); superinterfaces 包括直接接口和那个接口的任何超级接口(父母,祖父母,祖父母,...)
术语superinterface和direct superinterface在Java语言规范9.1.3中定义。超级接口和子接口:
如果提供了
子句,...extends
指定的接口类型是被声明接口的直接超接口类型。
...
如果第一个接口由第二个接口的直接超接口类型之一命名,则一个接口是另一个接口的直接超接口。superinterface关系是直接超接口关系的传递闭包。接口
是接口I
的超接口如果满足以下任一条件:K
- 的直接超接口
是I
.K
- 其中
是J
的直接超级接口,K
是I
的超级接口,递归地应用这个定义。J