Только классы без явных конструкторов получают конструктор по умолчанию. Для класса, который имеет один или несколько явно определенных конструкторов, их арность, переменная или нет, не имеет никакого отношения. Таким образом, для класса довольно обычно не иметь нулевого конструктора, и это действительно так в вашем классе.
Выбор из нескольких доступных конструкторов работает так же, как выбор среди перегруженных методов. Сначала определяются конструкторы доступные . Затем идентифицируются те, которые применимы к данным аргументам. Наконец, выбирается наиболее специфичный среди применимых конструкторов. Подробности указаны в разделе 15.12 JLS10. Это ошибка времени компиляции, если этот процесс не приводит к идентификации только одного конструктора.
В вашем примере оба доступных конструктора применимы к пустому списку аргументов, поэтому вопрос сводится к выбору наиболее конкретного. JLS предоставляет неофициальное описание:
один метод более специфичен, чем другой, если какой-либо вызов обрабатывается
первый метод может быть передан другому без
ошибка времени компиляции.
Формальные правила вращаются вокруг типов формальных параметров и учитывают формальные отношения типа / подтипа между примитивными типами, в результате чего SomeClass(int...)
более специфичен, чем SomeClass(long...)
, когда применимы оба. Таким образом, первый вариант выбран в вашем примере.