Аргумент var объектных массивов по сравнению с объектным массивом — пытающийся понять SCJP сам тестирует вопрос

Вы определили бы конструктора в абстрактном классе, если Вы находитесь в одной из этих ситуаций:

  • Вы хотите выполнить некоторую инициализацию (к полям абстрактного класса), прежде чем инстанцирование подкласса на самом деле произойдет
  • , Вы определили заключительные поля в абстрактном классе, но Вы не инициализировали их в самом объявлении; в этом случае у Вас ДОЛЖЕН быть конструктор для инициализации этих полей

Примечание что:

  • можно ли определить больше чем одного конструктора (с различными аргументами)
  • , Вы можете (должен?) определяют всех Ваших защищенных конструкторов (обнародовать их бессмысленно так или иначе)
  • , Ваш конструктор (конструкторы) подкласса может вызвать одного конструктора абстрактного класса; это может даже иметь к вызов это (если нет никакого конструктора без аргументов в абстрактном классе)

В любом случае, не забывайте, что, если Вы не определяете конструктора, тогда компилятор автоматически генерирует один для Вас (этот общедоступен, не имеет никакого аргумента, и ничего не делает).

5
задан 15 July 2009 в 03:40
поделиться

2 ответа

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

6
ответ дан 13 December 2019 в 22:13
поделиться
  1. При попытке определить, какой метод вызвать, компилятор сначала ищет метод, не являющийся vararg (например, sifter (Object) ), прежде чем рассматривать метод vararg (например, sifter (A [] ...) ), когда оба метода принадлежат одному и тому же классу (более или менее).

  2. Поскольку массив является объектом , вызов sifter (aa) будет соответствовать sifter (Object) , следовательно, даже не учитывая sifter (A [] ...) .

  3. Начиная с Java 5, компилятор может «упаковать» примитив, то есть преобразовать примитивные значения (например, int ) в их соответствующий объект (например, Integer ). Итак, для sifter (6) компилятор преобразует int 6 в Integer 6 , таким образом, он будет соответствовать методу sifter (Object) .

4
ответ дан 13 December 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: