Number n = new Number(5)
недопустимо, но Number n = 5
не. Почему?
Из-за автобокса. 5
не является объектом, поэтому он заключен в объект ( Integer
в данном случае), а Integer
- это Number
.
По сути, это ' 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, но будет используйте объединенную версию (например, шаблон «Легковес»).
Это похоже на то, как работает следующее:
List bob = new ArrayList();
Список - это интерфейс, поэтому вы не можете создать его экземпляр напрямую. Однако вы можете объявить переменную типа List, а затем назначить ей конкретный объект, реализующий этот интерфейс. Аналогичным образом вы можете объявить переменную типа Number, а затем присвоить ей любой объект значения, который является конкретным экземпляром этого типа. Что вы сделали с функциональным кодом, для всех намерений и целей (из-за автобокса):
Number n = new Integer(5);