java中的AbstractList和List
我知道,在Java中,大多数人使用以下方式声明列表:
List l = new ArrayList();
但这和
AbstractList l = new ArrayList();
在这个特定的实例中,与抽象类相比,使用接口有什么优势
你可以在下面搜索框中键入要查询的问题!
我知道,在Java中,大多数人使用以下方式声明列表:
List l = new ArrayList();
但这和
AbstractList l = new ArrayList();
在这个特定的实例中,与抽象类相比,使用接口有什么优势
# 1 楼答案
等级制度就像
及
所以
无论何时创建
ArrayList
的对象(如下面所示),都将参照List
创建ArrayList
的对象另一件需要注意的事情是,为什么需要在两个类中实现
List
, 所以参考:This SO Answer
# 2 楼答案
原始答案:
抽象类允许您定义一些共享功能,而其他功能则由实现定义。因此,如果您要创建一系列类似的类,这些类共享一些功能,但具有定制功能,那么抽象类非常有用
接口不允许定义任何功能。它只是定义了一组方法签名,您知道可以对实现该接口的类的任何对象调用这些方法签名
我想说,公认的做法是不使用抽象类来填充接口的角色。也就是说,抽象类应该用于在您定义的相关类之间共享代码,而接口应该用于抽象
不使用抽象类来填充接口角色的一个原因是,一个类不能从多个类继承,但它可以实现多个接口。因此,与使用接口相比,使用抽象类对设计的限制要大得多
编辑:
在这个特定的实例中,不同之处在于,如果稍后重新分配
l
以包含一个实现List
但不是从AbstractList
派生的对象,那么代码将抛出一个异常。并非所有实现List
的类都会扩展AbstractList
使用
AbstractList
会限制您仅处理从核心AbstractList
功能派生的列表。另一方面,任何人都可以使用全新的代码编写一个实现List
的类,如果您使用的是List
类型的变量,那么您仍然可以与以前从未见过的新类兼容Java的列表是从
AbstractList
派生出来的,这一事实应该被视为Java库内部的一个实现细节,而不是一个应该编码的接口# 3 楼答案
在这种情况下,也不会有什么不同。然而,将接口用作变量类型是一种常见的代码样式,因为
AbstractWhatever
类的抽象实现意味着更容易创建一个实现,而不必实现接口中的所有方法所以这是一个风格问题,不是技术问题