当前位置: 首页 > 面试题库 >

使用Collection接口创建ArrayList对象的多态性有什么好处?

蒋鹏鹍
2023-03-14
问题内容

我研究了多态性,并了解它可以进行动态方法绑定,如下所示。

假设动物类是抽象类。

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”(不是抽象类的接口)。

为什么只说一遍不是好习惯:

ArrayList myList = new ArrayList();

我阅读了Collection接口和ArrayList Java文档以及在线教程,但仍然不太清楚。有人可以给我一些解释吗?


问题答案:

如果声明myListArrayList,则修复其具体类型。每个使用它的人都将取决于此具体类型,并且很容易(甚至无意间)调用特定于的方法ArrayList。如果过了一段时间,您决定将其更改为例如LinkedListCopyOnWriteArrayList,则需要重新编译-
甚至可能更改-客户代码。接口编程消除了这种风险。

请注意,在Collection和之间ArrayList,还有另一个抽象层次:List接口。通常,列表的使用模式与映射,集合或队列的使用模式非常不同。因此,您通常需要尽早确定工作所需的收藏类型,并且不会改变。将变量声明为a
List可使此决定变得清晰,并向其客户提供有关此集合遵守的合同的有用信息。Collection通常,OTOH除了迭代其元素外,并没有太多用处。



 类似资料:
  • 问题内容: 我注意到有些人喜欢将对象声明为它实现的接口之一, 即使在变量的范围内,也不必将其视为接口 ,例如,没有期望接口的外部API。 例如: 或者你可以做 并避免完全导入。 与类本身(第二个)相反,通过接口(上面的第一个)声明它有什么好处? 谢谢 问题答案: 如果以后不使用该变量,则没有优点/缺点。使用接口而不是对象的原因是为了提供更大的灵活性,但是,如果不使用该变量,则与性能方面没有什么区别

  • 问题内容: 我是Java的新手,并且开始使用Java 。我想做的是为学生创建一个。每个学生都有与其相关的不同属性()。我试图弄清楚如何使用此属性添加新的学生对象。这是我所拥有的: 问题答案: 您需要的是以下内容:

  • 如何创建具有整数和字符串输入类型的?如果我创建一个: 这将是一个类型。如果我将其创建为: 这将是类型。我如何创建一个,它可以接受整数和字符串输入类型?谢谢。

  • 我遇到了一些Java代码: 在Java中,我第一次遇到一个构造函数或方法,它的参数是一个接口的“类型”。可以创建接口的对象吗?你能像普通物体一样使用它们吗? 在C语言中,我知道创建抽象类的对象是不可能的。

  • 我需要初始化“gDetailDS”对象的初始值。我不能创建类而不是接口,接口不允许我设置默认值。 我曾尝试使用map或其他函数来解决该问题,但未能成功。使用map,获取错误“\u this.gDetailDS.map不是函数”。 我想得到布尔值的默认值。例如,在执行以下行之后, 我应该有一个InterfaceB类型的对象,其默认设置为 你的帮助将不胜感激。

  • 问题内容: 为什么接口不扩展接口?不是键值对的集合吗? 问题答案: 集合假定一个值的元素。映射假定键/值对的条目。他们本来可以重新使用相同的通用接口,但是它们实现的某些方法不兼容,例如 您可以将Map建模为条目的集合,这就是这样做的。 有一些共同的方法。,,,但这些都不太可能有多少价值作为一个独立的接口。(可以再次使用)