有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的AbstractList和List

我知道,在Java中,大多数人使用以下方式声明列表:

List l = new ArrayList();

但这和

AbstractList l = new ArrayList();

在这个特定的实例中,与抽象类相比,使用接口有什么优势


共 (3) 个答案

  1. # 1 楼答案

    等级制度就像

    ArrayList extends AbstractList implements List
    

    AbstractList implements List
    

    所以

    无论何时创建ArrayList的对象(如下面所示),都将参照List创建ArrayList的对象

    List list = new ArrayList();
    

    另一件需要注意的事情是,为什么需要在两个类中实现List, 所以

    it is for the purpose of showing that ArrayList implements List. AbstractList in the whole picture is just for convenience and to reduce code duplication between List implementations.

    参考:This SO Answer

  2. # 2 楼答案

    原始答案:

    抽象类允许您定义一些共享功能,而其他功能则由实现定义。因此,如果您要创建一系列类似的类,这些类共享一些功能,但具有定制功能,那么抽象类非常有用

    接口不允许定义任何功能。它只是定义了一组方法签名,您知道可以对实现该接口的类的任何对象调用这些方法签名

    我想说,公认的做法是不使用抽象类来填充接口的角色。也就是说,抽象类应该用于在您定义的相关类之间共享代码,而接口应该用于抽象

    不使用抽象类来填充接口角色的一个原因是,一个类不能从多个类继承,但它可以实现多个接口。因此,与使用接口相比,使用抽象类对设计的限制要大得多

    编辑:

    在这个特定的实例中,不同之处在于,如果稍后重新分配l以包含一个实现List但不是从AbstractList派生的对象,那么代码将抛出一个异常。并非所有实现List的类都会扩展AbstractList

    使用AbstractList会限制您仅处理从核心AbstractList功能派生的列表。另一方面,任何人都可以使用全新的代码编写一个实现List的类,如果您使用的是List类型的变量,那么您仍然可以与以前从未见过的新类兼容

    Java的列表是从AbstractList派生出来的,这一事实应该被视为Java库内部的一个实现细节,而不是一个应该编码的接口

  3. # 3 楼答案

    在这种情况下,也不会有什么不同。然而,将接口用作变量类型是一种常见的代码样式,因为AbstractWhatever类的抽象实现意味着更容易创建一个实现,而不必实现接口中的所有方法

    所以这是一个风格问题,不是技术问题