Java 默认情况下,接口是否扩展对象?
如果您定义如下所示的接口Java 默认情况下,接口是否扩展对象?,java,Java,如果您定义如下所示的接口 interface I1{ } 在您可以编写的任何代码部分中 I1 i1; i1.equals(null); 那么equals方法从何而来,接口是否也扩展了超类对象?如果是这样,接口如何扩展类 假设让接口扩展超级类对象,那么如果您看到为什么集合接口(如Set thave)定义了equals()和hashCode()方法?。所有类都扩展了对象类,所以如果您在对象类中存在的接口中定义了任何抽象方法,那么实现接口的人就不需要实现这些方法。就像下面的代码一样 interf
interface I1{
}
在您可以编写的任何代码部分中
I1 i1;
i1.equals(null);
那么equals方法从何而来,接口是否也扩展了超类对象?如果是这样,接口如何扩展类
假设让接口扩展超级类对象,那么如果您看到为什么集合接口(如Set thave)定义了equals()和hashCode()方法?。所有类都扩展了对象类,所以如果您在对象类中存在的接口中定义了任何抽象方法,那么实现接口的人就不需要实现这些方法。就像下面的代码一样
interface I1{
String toString();
}
class A implements I1{
}
在这里,类A不需要实现方法toString(),因为它存在于对象类中。
那么,在集合接口中定义这些方法的目的是什么,因为它们不能强制实现类实现这些方法
那么equals方法从何而来,接口是否也扩展了超类对象?如果是这样,接口如何扩展类
Java语言规范明确地处理了这一点
发件人:
如果一个接口没有直接的超级接口,那么该接口隐式声明一个公共抽象成员方法m,其签名为s,返回类型为r,并抛出与每个公共实例方法m对应的子句t,该方法的签名为s,返回类型为r,抛出子句t在Object中声明,除非具有相同签名的方法,相同的返回类型,并且接口显式声明了一个兼容的throws子句
基本上,这是为了您可以使用equals
,hashCode
等,因为Java语言的指定方式意味着接口的任何具体实现都将是一个类,而该类最终必须是对象
的子类,因此成员肯定会出现
换句话说,虽然接口本身不扩展对象
,但众所周知,任何实现都会扩展
在这里,类A不需要实现方法toString(),因为它存在于对象类中。那么,在集合接口中定义这些方法的目的是什么,因为它们不能强制实现类实现这些方法
通常,这样做只是为了清楚起见,例如,记录在
对象中声明的成员对实现的期望,每个类隐式扩展对象,因此继承对象类的每个(非私有)方法
每个实例都有一个类,因此具有Object的所有方法
一个实例是否实现接口与这一点完全无关
对象是类,接口不能扩展类,所以“否”-接口不会从任何类继承任何内容。Java接口不会扩展Java.lang.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
class,那么这意味着MyClass也将通过创建多重继承来扩展MyInterface接口。因此,Java接口不扩展Java.lang.Object
类是有道理的,因为这会由于多重继承而造成混乱 好吧,OP说的是接口。@RohitJain现在好多了?我想我今天所做的非常感谢大家,所以我们可以说,interfcae不扩展对象类,关于Set接口的第二个问题的答案是什么?为什么他们定义了这些方法。@KrushnaCh.Dash:见我答案的结尾。Set.hashCode
和Set.equals
的文档提供了有关预期行为的更多详细信息。