我已经阅读了几篇文章Diff b/w I vs AC以及关于何时使用界面与抽象类的问题。
当我偶然发现ArrayList类时,ArrayList类扩展了AbstractList类实现的List接口。 AbstractList和List有常见的方法,如add(),remove()等。
编辑:换句话说,如果AbstractList实现List为什么有Arraylist类实现List
当两种方法都有共同的方法时,这种组合继承行为设计何时是首选的?
public class ArrayList<E> extends AbstractList<E>
implements List<E>
答案 0 :(得分:2)
在这种情况下,implements List
是多余的。可能要明确这个调用实现List而不必导航类层次结构。
答案 1 :(得分:2)
有时我会创建一个抽象BaseClass
,它实现一个接口IBaseClass
并创建ChildClass
,扩展BaseClass
。我的意思是:
public interface IBaseClass {
}
public abstract class BaseClass implements IBaseClass {
}
public class ChildClass extends BaseClass {
}
现在假设我有一个接口IChildClass
,ChildClass
实现了它。
public class ChildClass extends BaseClass implements IChildClass {
}
并说IBaseClass
有方法someMethod
。现在,如果您想通过实现接口ChildClass
使用IChildClass
的实例,例如:
IChildClass obj = new ChildClass();
然后你不能打电话给obj.someMethod()
。然后你需要这样做:
public interface IChildClass extends IBaseClass {
}
您可以在Java 1.2 documentation中找到界面java.util.List
未扩展java.util.Collection
,它在最新版本中执行。 java.util.List
是当时的最高界面,java.util.AbstractList
实现了List
ArrayList
。 AbstructList
轮流扩展AbstractCollection
。 AbstractCollection
然后是最高级别的。目前AbstractCollection
实施Collection
。因此很明显,遵循这种设计模式是为了保持Java的可扩展模式。
答案 2 :(得分:0)
AbstractList<E>
也实现List<E>
,因此它们是相同的方法。