是否有任何Java接口隐式实现了java.lang.Object?
当我做这样的事情时出现了这个问题:
public static String[] sizeSort(String[] sa) {
Comparator<String> c = new Comparator<String>() {
public int compare(String a, String b) {
if (a.length() > b.length()) return 1;
else if (a.length() < b.length())
return -1;
else
return 0;
}
};
// more code
}
即使我没有实现此接口的equals方法,它也能正常工作。 你的答案清除了这一点。但有人知道上面是匿名的本地内部类还是命名为本地内部类?
答案 0 :(得分:7)
排序。引用Java Language Specification:
如果界面没有直接 超级接口,然后接口 隐含地声明一个公共摘要 成员方法 m,带签名s, 返回类型r和throws子句t 对应每个公共实例 方法 m,带签名s,返回类型 r,并抛出条款t 声明 对象,除非方法与之相同 签名,相同的返回类型和a compatible throws子句是明确的 由接口声明。如果接口显式,则是编译时错误 在这种情况下声明了这样的方法 其中m被宣布为最终的 对象
请注意Object
有许多final和protected方法,所有接口都以这种方式“继承”,并且你不能在接口中有这些修饰符(这将由你的“implements java.lang”暗示) .Object“)。
答案 1 :(得分:6)
java.lang.Object不是接口,因此没有接口会隐式实现它。
但是,您创建的任何实现任何接口的类都将扩展Object,因为所有类都必须扩展它。因此,您(或实际上是其他任何人)可以创建的任何实例都将具有在java.lang.Object上定义的所有方法。
答案 2 :(得分:2)
Object
是一个类,而不是一个接口,所以它不能被其他接口“实现”。
接口的重点是它不包含任何实现细节。如果接口可以扩展一个类,它将继承该类的实现细节,这将破坏这一点。
答案 3 :(得分:1)
严格来说:你怎么知道它的区别?
您永远不会有对接口的引用,您将始终具有对Object
的实际实例的引用并实现该接口。这意味着即使声明的引用类型是接口,您也可以在任何引用(当然不是Object
)上调用来自null
的方法。