首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的隐式超级接口?

Java中的隐式超级接口?
EN

Stack Overflow用户
提问于 2009-04-29 17:39:35
回答 4查看 2.5K关注 0票数 4

所以我们都知道所有的类都隐式地扩展了Object。那么接口呢?是否有一个隐式的超级界面?我说有。下面的代码进行编译:

代码语言:javascript
复制
java.io.Serializable s1 = null;
java.io.Serializable s2 = null;

s1.equals(s2);

equals方法不是在Serializable中声明的,而是在Object中声明的。由于接口只能扩展其他接口,而Object是一个类,而不是一个接口,因此必须有一些正在扩展的隐式接口。然后Object类必须隐式地实现这个隐式接口(哇,写起来很奇怪)。

所以,问题是,这到底有多正确?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-04-29 17:47:51

由于接口只能扩展其他接口,而Object是一个类,而不是一个接口,因此必须有一些正在扩展的隐式接口。

不是的。引用Java Language Specification

如果接口没有直接的超接口,则接口隐式声明具有签名s、返回类型r的公共抽象成员方法m,并抛出与对象中声明的每个公共实例方法m对应的抛出子句t,除非接口显式声明了具有相同签名、相同返回类型和兼容的子句的方法。如果接口显式声明了这样一个方法m,则这是一个编译时错误,其中m在Object中被声明为final。

这与您的“隐式超级接口”之间的区别在于,Object有许多最终的和受保护的方法,并且您不能在接口中包含这些修饰符。

票数 16
EN

Stack Overflow用户

发布于 2009-04-29 17:42:56

这里的s1和s2是对象引用,指的是实现可序列化的对象的实例。Java中没有接口引用这样的东西。

所以Java知道无论这些对象是什么,它们都是从java.lang.Object派生出来的。因此上面的代码是有效的。

票数 7
EN

Stack Overflow用户

发布于 2009-04-29 17:44:13

当你声明像这样的东西时:

代码语言:javascript
复制
java.io.Serializable s1 = null;

别忘了Java中的一切都是从Object派生出来的。所以在这里,你只是说s1 is (或者Object或者一些扩展Object的类)那个implements Serializable。根本就没有魔法。Java中的所有东西都是从Object派生出来的,不管它是否显式。因此,equals方法始终可用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/803466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档