所以我们都知道所有类都隐式地扩展了Object。接口怎么样?是否存在隐式超级接口?我说有。以下代码编译:
java.io.Serializable s1 = null;
java.io.Serializable s2 = null;
s1.equals(s2);
equals
方法未在Serializable中声明,而是在Object中声明。由于接口只能扩展其他接口,而Object是一个类,而不是接口,因此必须有一些正在扩展的隐式接口。然后Object
类必须隐式实现这个隐式接口(哇,写起来很奇怪)。
所以,问题是,这有多正确?
答案 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
。
编译器知道s1
和s2
将实施Serializable
并将从Object
下降,因此它允许equals
。