猿问

多态性:为什么使用“List list = new ArrayList”

多态性:为什么使用“List list = new ArrayList”而不是“ArrayList list = new ArrayList”?

我什么时候应该使用

List<Object> list = new ArrayList<Object>();

ArrayList继承自List,所以如果某些功能ArrayList不在List,那么我将失去一些功能ArrayList,对吧?编译器在尝试访问这些方法时会注意到错误?


浮云间
浏览 1297回答 3
3回答

慕娘9325324

您这样做的主要原因是将代码与特定的接口实现分离。当你编写这样的代码时:List&nbsp;list&nbsp;=&nbsp;new&nbsp;ArrayList();其余的代码只知道数据是类型的List,这是更好的,因为它允许您List轻松地在接口的不同实现之间切换。例如,假设您正在编写一个相当大的第三方库,并说您决定使用一个实现库的核心LinkedList。如果您的图书馆在很大程度上依赖于访问这些列表中的元素,那么最终您会发现您做出了糟糕的设计决策;&nbsp;你会意识到你应该使用a&nbsp;ArrayList(它给出O(1)访问时间)而不是a&nbsp;LinkedList(它给出O(n)访问时间)。假设您已经编程到接口,那么进行这样的更改很容易。你只需要更改Listfrom&nbsp;的实例,List&nbsp;list&nbsp;=&nbsp;new&nbsp;LinkedList();至List&nbsp;list&nbsp;=&nbsp;new&nbsp;ArrayList();并且您知道这将有效,因为您已编写代码以遵循List接口提供的合同。另一方面,如果您使用了库的核心LinkedList list = new LinkedList(),那么进行这样的更改将不会那么容易,因为无法保证您的其余代码不会使用特定于LinkedList该类的方法。总而言之,选择只是设计问题......但这种设计非常重要(特别是在处理大型项目时),因为它可以让您在不破坏现有代码的情况下进行特定于实现的更改。

慕尼黑的夜晚无繁华

这称为编程接口。如果您希望将来转移到List的其他实现,这将非常有用。如果你想要一些方法,ArrayList你需要编程实现ArrayList a = new ArrayList()。

慕田峪9158850

这在暴露公共接口时也很有用。如果你有这样的方法,public&nbsp;ArrayList&nbsp;getList();然后你决定改成它,public&nbsp;LinkedList&nbsp;getList();任何正在做的人ArrayList list = yourClass.getList()都需要更改他们的代码。另一方面,如果你这样做,public&nbsp;List&nbsp;getList();更改实施不会改变API用户的任何内容。
随时随地看视频慕课网APP

相关分类

Java
我要回答