Вы определили бы конструктора в абстрактном классе, если Вы находитесь в одной из этих ситуаций:
Примечание что:
В любом случае, не забывайте, что, если Вы не определяете конструктора, тогда компилятор автоматически генерирует один для Вас (этот общедоступен, не имеет никакого аргумента, и ничего не делает).
Книга пытается объяснить, почему первые две перегрузки никогда не выбираются: потому что маркер var-args ...
заставляет их использоваться только в случае отказа любой другой возможной перегрузки. В этом случае этого не происходит - два предложения, начинающиеся с «Помните», объясняют, ПОЧЕМУ этого не происходит, почему существуют другие возможные перегрузки в первом и последнем случае (второй случай и его соответствие с третьей перегрузкой of sifter очевидно): массив - это объект, а int может быть помещен в коробку, а затем расширен до Object, поэтому 4-я перегрузка соответствует первому и последнему вызовам sifter.
При попытке определить, какой метод вызвать, компилятор сначала ищет метод, не являющийся vararg (например, sifter (Object)
), прежде чем рассматривать метод vararg (например, sifter (A [] ...)
), когда оба метода принадлежат одному и тому же классу (более или менее).
Поскольку массив является объектом
, вызов sifter (aa)
будет соответствовать sifter (Object)
, следовательно, даже не учитывая sifter (A [] ...)
.
Начиная с Java 5, компилятор может «упаковать» примитив, то есть преобразовать примитивные значения (например, int
) в их соответствующий объект
(например, Integer
). Итак, для sifter (6)
компилятор преобразует int 6
в Integer 6
, таким образом, он будет соответствовать методу sifter (Object)
.