Если классификационный индекс абстрактен, почему я, я позволил писать Номер n = 5?

Number n = new Number(5) недопустимо, но Number n = 5 не. Почему?

8
задан andandandand 16 December 2009 в 16:18
поделиться

4 ответа

Из-за автобокса. 5 не является объектом, поэтому он заключен в объект ( Integer в данном случае), а Integer - это Number .

26
ответ дан 5 December 2019 в 05:26
поделиться

По сути, это ' s потому что Number является абстрактным классом - там нет конструктора, который соответствует Number (5) , и даже если бы он был, вы все равно не сможете создайте экземпляр класса напрямую, потому что он абстрактный.

Как объясняет Бомб, во втором случае вы действительно создаете объект Integer *, который в качестве подкласса Number может быть присвоенным такой переменной. И поскольку это конкретный класс, вы можете создать его экземпляр.

* Хотя на практике он более эквивалентен Integer.valueOf (5) , который в Sun JRE не создает дополнительный объект Integer, но будет используйте объединенную версию (например, шаблон «Легковес»).

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

Как объясняет Бомб, во втором случае вы действительно создаете объект Integer * - который, как подкласс Число , может быть назначен такой переменной. И поскольку это конкретный класс, вы можете создать его экземпляр.

* Хотя на практике он более эквивалентен Integer.valueOf (5) , который в Sun JRE не создает дополнительный объект Integer, но будет используйте объединенную версию (например, шаблон «Легковес»).

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

Как объясняет Бомб, во втором случае вы действительно создаете объект Integer * - который, как подкласс Число , может быть назначен такой переменной. И поскольку это конкретный класс, вы можете создать его экземпляр.

* Хотя на практике он более эквивалентен Integer.valueOf (5) , который в Sun JRE не создает дополнительный объект Integer, но будет используйте объединенную версию (например, шаблон «Легковес»).

4
ответ дан 5 December 2019 в 05:26
поделиться

Это похоже на то, как работает следующее:

List bob = new ArrayList();

Список - это интерфейс, поэтому вы не можете создать его экземпляр напрямую. Однако вы можете объявить переменную типа List, а затем назначить ей конкретный объект, реализующий этот интерфейс. Аналогичным образом вы можете объявить переменную типа Number, а затем присвоить ей любой объект значения, который является конкретным экземпляром этого типа. Что вы сделали с функциональным кодом, для всех намерений и целей (из-за автобокса):

Number n = new Integer(5);
3
ответ дан 5 December 2019 в 05:26
поделиться

Не должно быть. автобокс - большая ошибка.

-2
ответ дан 5 December 2019 в 05:26
поделиться
Другие вопросы по тегам:

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