默认情况下接口是否扩展了Object?

时间:2012-12-08 09:02:13

标签: java

如果您定义如下界面

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类中。 那么在集合接口中定义这些方法的目的是什么,因为它们不能强制实现类来实现这些方法。

3 个答案:

答案 0 :(得分:30)

  

然后从equals方法到来的地方,接口是否也扩展了超类Object ?,如果那样,接口可以如何扩展类?

Java语言规范明确地处理了这个问题。

来自section 9.2

  

如果接口没有直接的超接口,那么接口隐式声明一个公共抽象成员方法m,其中包含签名s,返回类型r和throws子句t,对应于具有签名s的每个公共实例方法m,返回类型为r, throws在Object中声明的子句t,除非接口显式声明具有相同签名,相同返回类型和兼容throws子句的方法。

基本上,这是可以使用equalshashCode等 - 因为指定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类是有道理的,因为这会由于多重继承而造成混乱。