Java接口实现了对象?

时间:2011-10-02 22:35:45

标签: java

是否有任何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方法,它也能正常工作。 你的答案清除了这一点。但有人知道上面是匿名的本地内部类还是命名为本地内部类?

4 个答案:

答案 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的方法。