类在什么条件下实现接口?

时间:2014-09-19 16:32:46

标签: java oop inheritance interface

在使用这句话时,我的想法刚刚出现:

Queue<T> q = new LinkedList<T>();

我了解Queue是一个界面,而LinkedList类“实现”Queue拥有的所有方法,(add remove peek等)。

但是,我查看了LinkedList(openjdk6)的源代码,结果发现该类没有显式实现Queue接口。

public class LinkedList<E>
   extends AbstractSequentialList<E>
   implements List<E>, Deque<E>, Cloneable, java.io.Serializable

然后我阅读Deque<E>的源代码,看看Deque接口扩展Queue接口。 这是否意味着通过实施DequeLinkedList也在实施Queue及其所有祖先?

另外,如果我有一个实现了接口中所有方法的类,我可以使用接口类型分配该类的对象而不使用“implements”关键字吗?

4 个答案:

答案 0 :(得分:7)

是的,继承是传递的,带有接口和子类。即如果B延伸AC实施B,则C会实施A

不,你所描述的是"duck typing"

  

在使用面向对象编程语言的计算机编程中,duck typing是一种打字方式,其中对象的方法和属性决定了有效的语义,而不是从特定类或显式接口的实现继承。

这意味着如果它像鸭子一样走路并像鸭子一样嘎嘎叫,那么它必须是Duck。但是,在Java中,不支持鸭子输入。类必须显式实现接口或扩展类才能分配给该接口类型或超类类型。

答案 1 :(得分:2)

  

然后我阅读Deque的源代码,看看Deque接口扩展了Queue接口。这是否意味着通过实现Deque,LinkedList还实现了Queue及其所有祖先?

是。

只要实现类实际上是具体类,而不是抽象类。

  

另外,如果我有一个实现了接口中所有方法的类,我可以使用接口类型分配该类的对象吗?

没有。你所指的有时被称为Duck Typing。 Java * 不直接支持这一点。您只能将此类的对象分配给接口类型,如果,则通过在相应类的层次结构中的某处使用implements关键字显式声明接口。


* :正如评论中所指出:语言本身不支持鸭子打字。有一些反射黑客允许某些结构类似于真正允许Duck-Typing的语言中可以实现的结构。

答案 2 :(得分:1)

它实现了Deque,它扩展了Queue

这意味着所有Queue方法和所有Deque方法都已实现

http://www.docjar.com/html/api/java/util/LinkedList.java.html

第一个是

回答第二个问题 你必须“声明”你正在实现该接口

答案 3 :(得分:1)

好吧,忘记接口并考虑类。假设您的班级MyFrame延伸JFrame。以下代码是真还是假:

Object o = new MyFrame();

如果MyFrameJFrame的实例,而不是Object的实例(当然,这在hirarchy中非常广泛),此代码将无法编译。但它编译。<​​/ p>

回到接口,这是一样的。您上面编写的代码将编译,但如果LinkedList不实现Queue的方法(它必须是抽象类,或者LinkedList不会,它将无法编译)编译,所以你不能使用它。)