当前位置: 首页 > 面试题库 >

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

墨寂弦
2023-03-14
问题内容

如果您定义如下界面

interface I1{

}

您可以在任何代码段中编写如下

I1 i1;
i1.equals(null);

那么equals方法从何而来,接口是否还扩展了超类Object?,如果确实如此,接口如何扩展类?

假设让该接口扩展超类Object,那么如果您看到为什么像Set这样的集合接口定义了equals()和hashCode()方法呢?所有类都扩展了Object类,因此,如果您在Object类中存在的接口中定义任何抽象方法,则实现该接口的人无需实现这些方法。像下面的代码

interface I1{
String toString();
}

class A implements I1{

}

在这里,类A不需要实现方法toString(),因为它存在于Object类中。然后,在集合接口中定义这些方法的目的是什么,因为它们不能强制那里的实现类来实现这些方法。


问题答案:

那么equals方法从何而来,接口是否还扩展了超类Object?,如果确实如此,接口如何扩展类?

Java语言规范对此进行了明确的处理。

从第9.2节开始:

如果接口没有直接的超接口,则该接口隐式声明带有签名s的公共抽象成员方法m,返回类型r,并引发与每个带有签名s,返回类型r的公共实例方法m和throws子句t对应的子句t在Object中声明,除非接口明确声明了具有相同签名,相同返回类型和兼容throws子句的方法。

基本上,这样就 可以 使用equalshashCode等等-因为指定Java语言的方式意味着该接口的任何具体实现都
是一个类,并且该类最终 必须 是的子类Object,因此成员肯定是当下。

换句话说,虽然接口本身不扩展Object,但已知任何实现都可以。

在这里,类A不需要实现方法toString(),因为它存在于Object类中。然后,在集合接口中定义这些方法的目的是什么,因为它们不能强制那里的实现类来实现这些方法。

通常,这样做只是为了清楚起见,例如,根据中声明的成员来记录对实现的期望Object



 类似资料:
  • 我有以下验证组: 默认情况下,如果没有指定组,那么是否应该验证使用扩展的组注释的所有字段?

  • 问题内容: 我将实体添加到数据库中,并且工作正常。但是,当我检索列表时,会得到旧实体,直到取消取消部署应用程序并再次重新部署它之后,才会显示添加的新实体。这意味着默认情况下会缓存我的实体吗?但是,我没有在persistence.xml或任何此类文件中进行任何用于缓存实体的设置。 我什至尝试调用flush(),refresh()和merge()。但它仍然仅显示旧实体。我想念什么吗?请帮我。 问题答案

  • 默认情况下,我们的路由器是Yaf_Router, 而默认使用的路由协议是Yaf_Route_Static,是基于HTTP路由的, 它期望一个请求是HTTP请求并且请求对象是使用Yaf_Request_Http

  • 问题内容: 第二个命令是否将当前路径添加为另一个搜索路径? 用冒号分隔多个路径是否正确? 默认情况下,当前路径不是始终在ClassPath中,因此不需要显式指定吗? 谢谢。 问题答案: 从Oracle的页面上设置类路径: 默认的类路径是当前目录。设置CLASSPATH变量或使用命令行选项将 覆盖 默认值,因此,如果要在搜索路径中包括当前目录,则必须包括“。”。在新设置中。 使用了Windows和类

  • 当您没有在客户端的io.connect()函数中指定端口时,客户端将监听哪个端口? 例如: 我问的原因是因为我在Heroku上部署了这个应用程序的服务器端。前端是一个IOS应用程序。我在前端使用的objective C socketIO库(https://github.com/pkyeck/socket.io-objc)要求我指定一个端口。但我不确定应该监听哪个端口,因为这在服务器端不是静态的。