use*_*969 1 java list abstract
我知道在 Java 中大多数人使用以下方式声明列表:
List l = new ArrayList();
Run Code Online (Sandbox Code Playgroud)
但这和之间有什么区别
AbstractList l = new ArrayList();
Run Code Online (Sandbox Code Playgroud)
在这个特定实例中,使用接口相对于抽象类有哪些优点?
原答案:
抽象类允许您定义一些共享功能,同时让其他功能由实现来定义。因此,如果您要创建一系列共享某些功能但具有自定义功能的类似类,则抽象类非常有用。
接口不允许您定义任何功能。它只是定义了一组方法签名,您知道可以在实现该接口的类的任何对象上调用这些方法签名。
我想说,公认的做法是不使用抽象类来填补接口的角色。也就是说,抽象类应该用于在您定义的相关类之间共享代码,而接口应该用于抽象。
不使用抽象类来代替接口的原因之一是,一个类不能继承多个类,但它可以实现多个接口。因此,使用抽象类比使用接口对您的设计的限制更大。
编辑:
在此特定实例中,区别在于,如果您稍后重新分配以包含实现但不派生自 的l对象,则您的代码将引发异常。并非所有实现的类也扩展.ListAbstractListListAbstractList
使用AbstractList限制您只能使用从核心AbstractList功能派生的列表。另一方面,任何人都可以编写一个List使用全新代码实现的类,并且如果您使用类型变量List,那么您仍然可以与您以前从未见过的新类兼容。
Java 列表派生的事实AbstractList应该被视为 Java 库内部的实现细节,而不是您应该针对其进行编码的接口。