如果您定义如下界面
interface I1{
}
您可以在任何代码部分编写
I1 i1;
i1.equals(null);
然后从equals方法到来的地方,接口是否也扩展了超类Object ?,如果那样,接口可以如何扩展类?
假设让接口扩展超类Object,那么如果你看到为什么像Set thave这样的集合接口定义了equals()和hashCode()方法?所有类都扩展了Object类,因此如果在Object类中定义的接口中定义任何抽象方法,那么实现接口的人就不需要实现这些方法。如下面的代码
interface I1{
String toString();
}
class A implements I1{
}
这里的类A不需要实现方法toString(),因为它存在于Object类中。 那么在集合接口中定义这些方法的目的是什么,因为它们不能强制实现类来实现这些方法。
答案 0 :(得分:30)
然后从equals方法到来的地方,接口是否也扩展了超类Object ?,如果那样,接口可以如何扩展类?
Java语言规范明确地处理了这个问题。
来自section 9.2:
如果接口没有直接的超接口,那么接口隐式声明一个公共抽象成员方法m,其中包含签名s,返回类型r和throws子句t,对应于具有签名s的每个公共实例方法m,返回类型为r, throws在Object中声明的子句t,除非接口显式声明具有相同签名,相同返回类型和兼容throws子句的方法。
基本上,这是可以使用equals
,hashCode
等 - 因为指定Java语言的方式意味着接口的任何具体实现< em>将成为一个类,并且该类必须最终成为Object
的子类,因此成员肯定会出现。
换句话说,虽然接口本身不扩展Object
,但已知任何实现都会。
这里的类A不需要实现方法toString(),因为它存在于Object类中。那么在集合接口中定义这些方法的目的是什么,因为它们不能强制实现类来实现这些方法。
通常这只是为了清楚起见,例如根据{{1}}中声明的成员记录对实现的期望。
答案 1 :(得分:3)
每个类都隐式扩展Object
,因此继承了Object类的每个(非私有)方法。
每个实例都有一个类,因此具有Object的所有方法。
实例是否实现了接口与此点完全无关。
Object是一个类,接口不能扩展类,所以“no” - 接口不会从任何类继承任何内容。
答案 2 :(得分:0)
Java接口不会扩展java.lang.Object
类,但是实现该接口的对象实例将扩展Object类,否则,如果Java接口允许扩展java.lang.Object
类,则Java将支持该类的多重继承它不在其语言规范中。
请考虑以下情形:
interface MyInterface
{
// interface methods here
}
MyClass extend java.lang.Object implements MyInterface
{
// override methods or interface method implementations
}
现在,如果MyInterface扩展了java.lang.Object
类,则意味着MyClass也将通过构造创建多个继承来扩展MyInterface接口。因此,Java接口不扩展java.lang.Object
类是有道理的,因为这会由于多重继承而造成混乱。