我研究了多态性,了解到它可以像下面这样进行动态方法绑定(bind)。
假设类 Animal 是抽象类。
public class AnimalReference
{
public static void main(String args[])
Animal ref // set up var for an Animal
Cow aCow = new Cow("Bossy"); // makes specific objects
Dog aDog = new Dog("Rover");
// now reference each as an Animal
ref = aCow; ref.speak();
ref = aDog; ref.speak();
}
我曾经像这样创建 ArrayList 的实例:
ArrayList myList = new ArrayList();
但通常我认为人们会写:
Collection myList = new ArrayList();
所以我的困惑是声明为 Collection 有什么好处?我也不知道你可以在“myList”前面有“Collection”(它是一个接口(interface)而不是抽象类)。
为什么只说:
ArrayList myList = new ArrayList();
我看了Collection接口(interface)和ArrayList Java文档以及网上教程,但还是不太清楚.. 谁能给我一些解释?
最佳答案
如果您将myList
声明为ArrayList
,您就固定了它的具体类型。每个使用它的人都将依赖于这个具体类型,并且很容易(甚至无意中)调用特定于 ArrayList
的方法。如果稍后您决定将其更改为例如LinkedList
或 CopyOnWriteArrayList
,您需要重新编译 - 甚至可能更改 - 客户端代码。接口(interface)编程消除了这种风险。
请注意,在 Collection
和 ArrayList
之间,还有另一个抽象级别:List
界面。通常,列表的使用模式与映射、集合或队列的使用模式非常不同。因此,一份工作所需的 Collection 品类型通常在早期就已决定,并且不会改变。将您的变量声明为 List
可以明确此决定,并为其客户提供有关此集合所遵守的契约(Contract)的有用信息。 Collection
OTOH 除了遍历其元素外通常不是很有用。
关于java - 使用 Collection 接口(interface)创建 ArrayList 对象的多态性有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3356113/