虽然构造函数需要参数我仍然可以在没有它们的情况下调用它

Although constructor needs arguments i can still call it without them

public class DenseVector extends AbstractVector implements Vector {

  public DenseVector(int n) { .. } 

  public DenseVector(Vector v) { .. }

  public DenseVector(double... elements) { .. }

}

为什么我可以在没有参数的情况下调用带有可变参数的构造函数?

DenseVector v = new DenseVector() // calls DoubleVector(double... elements)

AbstractVector根本没有手动提供的构造函数。

可变参数采用任意数量 个参数。包括 none.

如果你想要一个或多个,一个常见的(有点笨拙的)模式是

public DenseVector(double element, double... moreElements)

Why can I call a constructor with variadic arguments without arguments?

您没有默认构造函数(不会生成),可变参数构造函数是唯一的选择(它需要 [0, n] double 秒 - 您通过了 none).

DenseVector v = new DenseVector();

要调用无参数构造函数(如果这是您的意图),您必须先定义它。

AbstractVector has no manually provided constructors at all

这就是为什么你不应该在所有引用非默认父构造函数的构造函数中编写 super(...)

可变参数允许函数(在您的例子中为构造函数)接受任意数量的参数。即使不提供参数,也可以调用相同的函数。

可以使用任意数量的参数调用可变参数构造函数(包括 0 ) 看一看 Java, 3 dots in parameters

如 Java 语言规范所述 here:

如果被调用的方法是可变元数方法m,它必然有n > 0 个形式参数。对于某些 Tm 的最终形式参数必须具有类型 T[],并且 m 必须用 k 0 个实参表达式调用。

k ≥ 0,表示您可以将 0 个实际参数传递给该方法。