【问题标题】:Java ArrayList instantiation [duplicate]Java ArrayList 实例化
【发布时间】:2015-08-04 12:34:55
【问题描述】:

我只是想知道为什么我们初始化父类的对象并用子类实例化它而不是直接实例化子类对象。

示例:

List<String> sampleList=new ArrayList<String>();

不是

ArrayList<String> sampleList=new ArrayList<String>();

【问题讨论】:

标签: java arraylist


【解决方案1】:

假设我创建了一个使用ArrayList 执行某些操作的方法:

public int sum(ArrayList<Integer> list){
   int sum = 0;
   for(Integer x : list){
      sum += x;
   }
   return sum;
}

现在可以正常工作,任何拥有ArrayList 的人都可以调用它。但是拥有LinkedList 的人呢?他们运气不好!

但是我为什么要排除它们呢?我的函数实际上并没有使用特定于 ArrayList 的任何东西——我实际上并不关心需要知道该函数所提供的 List 的类型。那么为什么不让它尽可能通用,以便任何拥有List 的人都可以调用我的函数呢?

public int sum(List<Integer> list){
   int sum = 0;
   for(Integer x : list){
      sum += x;
   }
   return sum;
}

同样,如果我实际上并不关心 List 是什么类型,为什么还要将变量声明为 ArrayList?如果我想稍后将该变量更改为 LinkedList 怎么办?如果我将其声明为List,那么这是一个单行更改。但是如果我将它声明为ArrayList,那么我必须更改对它的每一个引用。这在大型项目中可能会变得非常烦人,因此通常最好让变量尽可能通用。

【讨论】:

  • 最好改用Collection
【解决方案2】:

首先列表是一个接口而不是一个类。 其次这叫Polymorphism,多态是面向对象编程中的一个重要概念。

使用对父类(或由该类实现的接口)的引用的用例是,如果您想使用该引用来迭代该父类的不同子类。

This 线程可能会引起您的兴趣。

【讨论】:

    【解决方案3】:

    您的问题至少在以下几个方面是错误的:

    1. 我们不会在List&lt;String&gt; sampleList 部分“初始化父类的对象”——这只是类型声明

    2. 您不能在实例化对象之前对其进行初始化。

    3. 实际上我们实例化了,而不是对象。类实例化的结果是一个对象。

    4. List 不是“父类”,它是一个接口。接口根本无法实例化/初始化。

    如果我们从您的问题中消除所有这些错误并将其改写为“为什么我们声明一个通用类型的变量”,那么答案是它使代码更具可读性和可维护性:您保证不会使用这种方式ArrayList 的任何细节,但严格将其用作一般 List。这在方法参数中使用时变得更加重要:它允许您的方法与任何List 实现一起使用,从而使您的方法更有用。这实际上就是多态性的全部意义所在。

    【讨论】:

      猜你喜欢
      • 2022-12-18
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 2023-04-02
      • 2015-07-05
      • 2013-03-19
      相关资源
      最近更新 更多