Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 默认情况下,接口是否扩展对象?_Java - Fatal编程技术网

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
的文档提供了有关预期行为的更多详细信息。