【问题标题】:What for we need super() in ArrayList constructor?我们在 ArrayList 构造函数中需要 super() 什么?
【发布时间】:2015-01-27 09:12:07
【问题描述】:

此代码来自 ArrayList 源代码:

public ArrayList() {
    super();
    this.elementData = EMPTY_ELEMENTDATA;
}

此代码来自 AbstractList 源代码:

protected AbstractList() {
}

super() 是做什么的?

【问题讨论】:

  • 您想知道super 的一般作用,或者为什么super 在这种情况下使用?

标签: java arraylist collections


【解决方案1】:

super()调用父构造函数。

super() 从来不需要,但是写它不是一个坏习惯,因为它有利于可读性 - 它提醒您调用了父构造函数。

看到这个问题When do you need to explicitly call a superclass constructor?

【讨论】:

  • 从不需要?你确定吗?
  • 好吧,让我重写答案,我没有很好地表达自己。
  • 编辑:经过一番谷歌搜索,我很确定。真的从来不需要。
  • 如果我有一个没有无参数构造函数的父类怎么办?我需要调用super then.
  • @Makoto 即使父级没有无参数构造函数,super 也不需要实例化子级
【解决方案2】:

一般来说,super 将调用其父构造函数并使用匹配的参数。在这种情况下,因为AbstractList 有一个隐式无参数构造函数,我们使用不带参数的super() 来调用隐式无参数构造函数。

至于为什么 - 如果不需要在父类中设置字段,那么在这种情况下确实没有理由这样做。这可能是一种较旧的编程风格。

它没有害处,而且它是自我记录的;它是明确的,因为它调用了它的父构造函数。不过,我会注意到该构造函数的 Javadoc 调用了它的调用有用性:

/**
 * Sole constructor.  (For invocation by subclass constructors, typically
 * implicit.)
 */

与显式相比,您更有可能看到该构造函数的隐式调用。

【讨论】:

  • 也可以在这里期待AbstractList 的构造函数实际上会做某事的版本
  • 考虑到AbstractList 从 1.2 开始就已经存在,我真的怀疑他们是否对构造函数有所期待。这也可能是遗留问题。我不知道;我必须拉下源代码历史才能确定。
猜你喜欢
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 2019-11-17
  • 2023-04-09
  • 2020-03-10
  • 2011-09-27
  • 2015-02-24
相关资源
最近更新 更多