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

14 浏览
0 Comments

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

可能是重复问题:

为什么应该首选Java类的接口?

什么时候应该使用 List list = new ArrayList();?

ArrayList继承自List,所以如果List中没有ArrayList中的某些特性,那么我将会失去ArrayList的一些特性,对吗?当尝试访问这些方法时,编译器会提示错误吗?

0
0 Comments

多态性:为什么使用"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"的原因是为了实现多态性,提高代码的灵活性和可维护性。通过使用父类的引用来引用子类的对象,我们可以方便地切换不同的实现类,而无需修改大量的代码。

希望这篇文章对你有所帮助!

0
0 Comments

多态性:为什么使用“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改为其他类型,这是不是过早的优化?

0
0 Comments

多态性是面向接口编程的一种方式。这种方式在将来要切换到其他的List实现时非常有帮助。如果你想要使用ArrayList的一些方法,你需要通过编程实现ArrayList,如ArrayList a = new ArrayList()。但是,如果你使用List接口来编程,如List list = new ArrayList(),你可以在不修改代码的情况下将ArrayList切换为其他实现,只需将new ArrayList()替换为其他实现的实例化代码。这种方式使得代码更具灵活性和可扩展性。

0