2011-10-02 146 views
3

是否有任何Java接口隐式实现java.lang.Object?Java接口实现对象?

这个问题出现了,当我做了这样的事情:

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 

} 

它,即使我没有实现相当于此接口的方法工作得很好。 你的答案清除了这一点。但是,有没有人知道如果上面是匿名的本地内部类或命名的本地内部类?

+0

这是一个匿名的内部类,因为它没有名字。 –

+0

虽然下面有一些很好的答案,但请考虑这一点:'class X {}' - 不需要定义'equals';为什么?对于实现接口的匿名类也是如此:所有类声明不隐式扩展另一个类扩展对象(因此所有的类直接或间接扩展对象)。 – 2011-10-02 22:55:17

回答

7

排序援引Java Language Specification

如果接口没有直接 超接口,则接口 隐式地声明公共抽象 构件方法米与签名s, 返回类型r和throws子句吨 对应给每个公开实例 方法 m带签名s,返回类型 r,并抛出子句t 在 中声明对象,除非有相同的方法 签名,相同的返回类型和 兼容的throws子句明确地由接口声明的 。如果接口显式地 在 的情况下声明了这样一种方法m,那么这是一个编译时错误,其中m在 对象中声明为final。

注意Object有一些最终和受保护的方法,所有的接口“继承”这样一来,你不能在一个接口的修饰符(这将通过您的“实现的java.lang暗示。目的”)。

+0

+1有趣的摘录/查找。我不知道JLS“提升”了对象契约的接口。我想这是明确规定能够讨论这种方法的“阴影”。 – 2011-10-02 22:51:22

+0

+1这很有趣,它也有意义,否则你怎么能在界面上调用hashCode? –

6

java.lang.Object不是接口,所以没有接口会隐含地实现它。

但是,您创建的任何实现任何接口的类都将扩展Object,因为所有类都必须扩展它。因此,您(或其他任何人)可以创建的任何实例都将拥有在java.lang.Object上定义的所有方法。

1

严格地说:你怎么知道它们的区别? 你永远不会有一个接口的引用,你将始终引用一个实际的实例,并且是一个Object并实现该接口。这意味着即使参考的声明类型是接口,您也可以在任何参考(当然不是null)上调用Object的方法。

+0

但是你的引用的声明类型可以是一个接口,那么当它不是接口的一部分时,你怎么能调用equals()呢? –

+2

因为Java知道它也是'Object'吗? –

+0

这个问题似乎是关于Java如何“知道”的。 –

2

Object是一个类,不是接口,所以它不能被其他接口“实现”。

接口的要点是它没有实现细节。如果一个接口可以扩展一个类,它将会继承该类的实现细节,这将破坏这一点。