Java中的隐式超级接口?

时间:2009-04-29 17:39:35

标签: java

所以我们都知道所有类都隐式地扩展了Object。接口怎么样?是否存在隐式超级接口?我说有。以下代码编译:

java.io.Serializable s1 = null;
java.io.Serializable s2 = null;

s1.equals(s2);

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

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

4 个答案:

答案 0 :(得分:15)

  

由于接口只能扩展其他接口   接口,而Object是一个类,而不是   一个界面,必须有一些   隐式接口正在存在   延长。

没有。引用Java Language Specification

  

如果界面没有直接   超级接口,然后接口   隐含地声明一个公共摘要   成员方法 m,带签名s,   返回类型r和throws子句t   对应每个公共实例   方法 m,带签名s,返回类型   r,并抛出条款t 声明   对象,除非方法与之相同   签名,相同的返回类型和a   compatible throws子句是​​明确的   由接口声明。如果接口显式,则是编译时错误   在这种情况下声明了这样的方法   其中m被宣布为最终的   对象

这与“隐式超级界面”之间的区别在于Object有许多最终和受保护的方法,你不能在界面中有这些修饰符。

答案 1 :(得分:7)

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

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

答案 2 :(得分:0)

当您声明如下内容时:

java.io.Serializable s1 = null;

不要忘记Java中的所有内容都来自Object。所以,在这里,您只是说s1 某事Object或某些类Object} implements Serializable。没有魔力。 Java中的所有内容都源自Object,无论它是否明确。因此,equals方法始终可用。

答案 3 :(得分:0)

我认为没有任何超级界面。

当你声明一个这样的变量时:

java.io.Serializable s1 = null;

您尚未创建任何Object

编译器知道s1s2将实施Serializable并将从Object下降,因此它允许equals