Я понимаю такие вещи, как:

  1. Класс Wrapper создает объект, а примитив не создает объект
  2. Классы-оболочки используются с коллекциями для представления типа
  3. Оболочки имеют методы и могут содержать адрес памяти / ноль, а примитивы содержат значения по умолчанию.
  4. Примитивы быстро сравниваются с классами-оболочками, поскольку нет накладных расходов на методы или объекты
  5. Как работает автоматический бокс и распаковка
  6. Класс-оболочка оборачивает примитивный тип

Однако не смог понять реальную разницу между примитивами и классами-оболочками. Почему возникла необходимость создать два разных способа хранения данных? Почему мы не использовали то, что уже было доступно? Например, если классы-оболочки были обнаружены до примитивов, то почему мы не использовали классы-оболочки вместо того, чтобы открыть совершенно другой способ для аналогичной цели и наоборот.

1
Hardik 7 Авг 2020 в 06:55

2 ответа

Лучший ответ

Настоящая разница в том, что примитивные типы не являются ссылочными типами .

В системе типов Java ссылочные типы имеют общий корень, а примитивные типы - нет: все ссылочные типы являются подтипами Object. Для сравнения: примитивные типы не имеют общего корня; каждый примитивный тип - это свой особенный единорог.

Это означает, что переменная, объявленная с типом Object, может содержать значение любого ссылочного типа, но не может содержать значение любого примитивного типа.

Это проблема, если вы хотите создать общие полезные структуры данных. Подумайте, как бы вы реализовали структуру данных «динамический массив», такую как ArrayList или Vector. Вы можете использовать массив Object[] для хранения элементов, и это будет работать для всех ссылочных типов. Но поскольку примитивные типы не имеют общего корня, вам придется создавать отдельную реализацию для каждого примитивного типа.

Для решения этой проблемы были созданы классы-оболочки. Теперь вместо того, чтобы требовать 8 отдельных реализаций динамического массива (1 для ссылочных типов и 7 для примитивных типов), вы можете заключить каждое примитивное значение в объект и просто использовать реализацию для ссылочных типов.

Примитивные типы и классы-оболочки были созданы одновременно с созданием первого дизайна и реализации Java 1.0. Дизайнеры не «повторно использовали то, что уже было доступно», потому что ничего не было доступно: они построили все с нуля.

Могли ли дизайнеры решить проблему другим способом, возможно, создав систему типов, имеющую общий корень как для примитивных, так и для ссылочных типов? Да, но они этого не сделали, и, вероятно, у них были веские причины: сложность реализации, простота понимания, время выхода на рынок, ...

5
Joni 7 Авг 2020 в 05:02

На самом деле, это довольно проницательный вопрос. Ответы хорошие и правильные, но основной вопрос, который, я думаю, стоит задать: должны ли вообще существовать примитивные типы? В то время у нас было много споров по этому поводу, и я думаю, что причина того, что все закончилось так, как раньше, была связана с тем, что Oak (позже Java) был разработан как встроенный язык для IOT (Интернета вещей). Если бы он был изначально разработан как серверный язык, он мог бы быть совсем другим. Я думаю, что примитивные типы - это устаревшая идея, которая на самом деле очень вредна именно по тем причинам, которые упоминает Джони. Возможно и желательно, чтобы все в системе расширяло Object.

Как можно было избавиться от примитивов? С более умной JVM. HotSpot мог бы по возможности превращать специальные примитивные объекты в соответствующий машинный код, и не было бы необходимости в автобоксировании, оболочках или трудностях с разделяемой системой типов. Единственное ограничение, которое, как мне кажется, должно быть наложено на Integer, Float, Double и т.д., - это то, что они должны быть окончательными. Это позволило бы оптимизировать эти классы везде, где это возможно, как если бы они были примитивами, фактически не имея примитивов в языке. Вы могли бы даже использовать синтаксические сокращения, такие как int, float и double для этих специальных классов, но важно то, что система типов была бы лучше, если бы она была полностью унифицирована.

Но вы не начинаете пытаться построить такую вещь, когда думаете об умных тостерах. То, что случилось с Java с точки зрения ее безумного успеха, было чистой случайностью. Это оказалось решением многих проблем, связанных с Интернетом, просто сидящим там в нужное время. Но это не было запланировано таким образом, поэтому есть много вещей, которые люди хотели бы получить обратно. Я думаю, что многие люди в Sun / Oracle задним числом исключили бы примитивы.

1
Jon 7 Авг 2020 в 04:58