多态性:为什么使用 "List list = new ArrayList" 而不是 "ArrayList list = new ArrayList"?
多态性:为什么使用 "List list = new ArrayList" 而不是 "ArrayList list = new ArrayList"?
可能是重复问题:
什么时候应该使用 List
?
ArrayList
继承自List
,所以如果List
中没有ArrayList
中的某些特性,那么我将会失去ArrayList
的一些特性,对吗?当尝试访问这些方法时,编译器会提示错误吗?
多态性:为什么使用"List list = new ArrayList"而不是"ArrayList list = new ArrayList"?
在面向对象编程中,多态性是一个重要的概念。多态性允许我们使用一个父类的引用来指向其子类的对象,从而实现对不同子类对象的统一操作。这种特性可以提高代码的灵活性和可维护性。
在Java中,List是一个接口,而ArrayList是List接口的一个具体实现。如果我们使用"List list = new ArrayList"来声明一个变量,那么这个变量可以引用任何实现了List接口的对象,包括ArrayList、LinkedList等。这样一来,我们可以方便地根据需要切换具体的实现类,而无需修改大量的代码。
假设我们有一个公共接口,其中有一个方法"public ArrayList getList()",返回一个ArrayList对象。但是后来我们决定将具体的实现类改为LinkedList。如果此时我们直接修改方法的返回类型为"public LinkedList getList()",那么所有调用这个方法的地方都需要修改代码。然而,如果我们将返回类型声明为"public List getList()",并且返回一个ArrayList对象,那么修改实现类为LinkedList不会对使用API的用户产生任何影响。
通过使用多态性,我们可以将具体的实现类与公共接口解耦,并且能够轻松地切换不同的实现类,而不会对使用这些接口的代码产生影响。这使得代码更加灵活、可扩展和易于维护。
总结起来,使用"List list = new ArrayList"而不是"ArrayList list = new ArrayList"的原因是为了实现多态性,提高代码的灵活性和可维护性。通过使用父类的引用来引用子类的对象,我们可以方便地切换不同的实现类,而无需修改大量的代码。
希望这篇文章对你有所帮助!
多态性:为什么使用“List list = new ArrayList”而不是“ArrayList list = new ArrayList”?
多态性是面向对象程序设计中的一个重要概念,它允许我们使用基类类型的引用来引用子类类型的对象。这种处理方法使得代码更加灵活,容易维护和扩展。在Java中,多态性可以通过接口来实现。
在上述讨论中,我们可以看到使用“List list = new ArrayList”而不是“ArrayList list = new ArrayList”的主要原因是为了解耦代码和特定实现。使用“List”作为类型,可以轻松切换不同的“List”接口实现,这是首选的。
举个例子,假设我们正在编写一个庞大的第三方库,并决定使用“LinkedList”来实现库的核心。如果该库在对这些列表中的元素进行访问方面非常依赖,那么最终会发现这是一个糟糕的设计决策;我们会意识到应该使用“ArrayList”(具有O(1)的访问时间)而不是“LinkedList”(具有O(n)的访问时间)。如果我们已经按照接口进行编程,那么进行这样的更改就很容易。我们只需将“List”实例从
List list = new LinkedList();
更改为
List list = new ArrayList();
这样做是可行的,因为我们已经按照“List”接口提供的契约编写了代码。
另一方面,如果我们使用LinkedList list = new LinkedList()
实现库的核心,进行这样的更改就不那么容易,因为不能保证代码的其余部分不使用特定于“LinkedList”类的方法。
这个选择只是一个设计问题……但这种设计在大型项目中非常重要,因为它可以让你稍后进行特定于实现的更改而不会破坏现有代码。
很多人没有提到,在方法签名中或作为类级变量的类型中使用List接口是完全可以接受的,可以将其作为局部变量通过ArrayList list = new ArrayList()进行实例化。当将List暴露给其他方法或库时,才会获得实际的好处。
正如先前提到的那样,使用List list = new ArrayList()
是为了确保不会破坏现有代码,在客户端和开发者自身的角度上都是如此。
通过这种方式进行强制转换,哪些方法可用于这个转换?list还是arraylist?
Safallwa的方法是List的方法,或者你可以稍后进行向下强制转换以使用ArrayList的方法。
你对ArrayList的list.removeRange()
有什么看法?这让我不得不将list强制转换为ArrayList来使用。LinkedList也有这样的方法。
使用List al = new ArrayList()
会使你失去一些可能在al
中使用的ArrayList特性,对此你有什么看法?
对我而言,我曾经在各种项目中工作过,从来没有将我的列表从ArrayList改为其他类型,这是不是过早的优化?