在使用这句话时,我的想法刚刚出现:
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
接口。
这是否意味着通过实施Deque
,LinkedList
也在实施Queue及其所有祖先?
另外,如果我有一个实现了接口中所有方法的类,我可以使用接口类型分配该类的对象而不使用“implements”关键字吗?
答案 0 :(得分:7)
是的,继承是传递的,带有接口和子类。即如果B
延伸A
而C
实施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();
如果MyFrame
是JFrame
的实例,而不是Object
的实例(当然,这在hirarchy中非常广泛),此代码将无法编译。但它编译。</ p>
回到接口,这是一样的。您上面编写的代码将编译,但如果LinkedList
不实现Queue
的方法(它必须是抽象类,或者LinkedList
不会,它将无法编译)编译,所以你不能使用它。)