为什么一些带参数的构造函数仍然调用this()?好像什么都没做?

时间:2016-07-20 10:33:54

标签: java constructor linked-list

以下代码来自LinkedList.java版本中的1.8。 我无法理解为什么要调用this()?构造函数LinkedList()似乎什么都不做?

/**
 * Constructs an empty list.
 */
public LinkedList() {
}

/**
 * Constructs a list containing the elements of the specified
 * collection, in the order they are returned by the collection's
 * iterator.
 *
 * @param  c the collection whose elements are to be placed into this list
 * @throws NullPointerException if the specified collection is null
 */
public LinkedList(Collection<? extends E> c) {
    this();
    addAll(c);
}

2 个答案:

答案 0 :(得分:0)

你是对的。它什么都不做。默认情况下,空构造函数调用super()。如果没有this()第二个构造函数,默认情况下也会调用super()。我的猜测是,一旦LinkedList()中有一些初始化,并且通过调用this(),此初始化也会在LinkedList(Collection<? extends E> c)中使用。现在它是一个无用且无害的剩余物。

答案 1 :(得分:0)

我们不能给你一个明确的原因,为什么他们调用一个空的构造函数。

但是如果您查看 Java 6 中的同一个类,您会看到 那里 无参数构造函数的定义如下:

public LinkedList() {
    header.next = header.previous = header;
}

所以我的理论是在 Java 8 中调用 this() 而不是 super() 的原因是:

  • 或者没有理由:这只是一个疏忽,
  • this() 调用是出于兼容性原因而保留的1

在实践中,这不应该对性能产生任何影响。 JIT 编译器应该能够内联冗余构造函数调用。


1 - 例如,从调用链中删除构造函数堆栈框架可能会导致某人的自定义 SecurityManager 代码中断。安全检查逻辑可能依赖于对来自不受信任代码的调用和进行检查的代码之间的堆栈帧计数。