Подклассы Number
обертывают примитивные числовые типы (Byte
, Integer
, Double
, Float
, Long
и Short
).
Какую цель они выполняют?
Подклассы Number
обертывают примитивные числовые типы (Byte
, Integer
, Double
, Float
, Long
и Short
).
Какую цель они выполняют?
Эти классы-оболочки были созданы таким образом, чтобы можно было использовать эти примитивные типы с различными контейнерными классами, такими как ArrayList
. Поскольку примитивные типы не могут быть непосредственно привязаны к ссылкам Object
, они хранятся в классах-оболочках, чтобы они могли использоваться там, где требуются ссылки Object
.
Поскольку обертки Objects
.
Collections
нужны объектыinstantiated
равными nullNullPointerException
вместо странного поведения, если вы, например, создаете экземпляр -1 в примитивеМногие ранние объектно-ориентированные языки (Smalltalk и т.д.) имеют общий "верхний тип" для всех значений, что упрощает определение общих операций, которые являются агностическими для тип значений, которые они перемещают.
Верхний тип теории типов, обычно сокращенный как верхний или нижний символ (⊤), является универсальным типом, который содержит все возможные объекты в интересующей вас системе типов.
Java не имеет такого верхнего типа, но Object
является самым близким к нему. Наличие сопоставления из примитивных значений в экземплярах Object
позволяет эффективно функционировать как верхний тип.
Средства основного языка java.lang.reflect
используйте Object
в качестве средства ожидания для верхнего типа - когда вы рефлексивно вызываете метод, который вы проходите в Object
, и возвращаете Object
.
В соответствии с этой ссылкой java tutorial:
Есть три причины, по которым вы можете использовать объект Number, а не примитив:
- В качестве аргумента метода, который ожидает объект (часто используется при манипулировании наборами чисел).
- Использовать константы, определенные классом, такие как MIN_VALUE и MAX_VALUE, которые обеспечивают верхнюю и нижнюю границы типа данных.
- Использовать методы класса для преобразования значений в и из других примитивных типов, для преобразования в строки и из строк, а также для преобразования между числовыми системами (десятичной, восьмеричной, шестнадцатеричной, двоичной).
Дизайнеры Java по уважительным причинам или плохому - решили не основывать все типы на Object
.
Примитивные типы, такие как int
, long
, char
и т.д., Не основаны на Object
, и из-за этого они имеют довольно разную семантику, например, они передаются по значению, а не по ссылке.
Integer
/long
- это в основном просто классы-оболочки, чтобы примитивные типы вели себя как любой другой тип, чтобы иметь возможность использовать их в контекстах, где классы или объекты лучше подходят.
Например, из-за различий в семантике коллекции должны иметь две версии: одну для Object и одну для примитивных типов. Просто проще сделать одну версию коллекции и обернуть примитивные типы.
Классы-оболочки в API Java в основном служат двум основным целям:
Обработать их как объекты и поместить их в список, карты и т.д.
Итак, мы можем добавлять примитивные типы данных в коллекции. Чтобы добавить элементы в коллекцию, они должны быть типа objects
. Итак, были введены классы Wrapper, которые позволяют создавать объекты primitive data types
.
Например:
Arraylist : add(Object o)
TreeSet: add(Object o)
Лично я использую их как параметры для методов, поэтому мне не нужно беспокоиться о типе передаваемого числа. Тогда я могу использовать методы, такие как doubleValue(), чтобы получить значение и продолжать, не беспокоясь о что было передано.
Это основная причина когда-либо иметь базовый базовый класс.
Существует определенный тип "указателя", который может указывать на любой тип (например, void
в C/С++).
Я имею в виду java.lang.Object
.
например. вы можете сделать это:
List<String> aList = new ArrayList<String>();
Object o = aList;
НО, это недоступно для примитивов, т.е. для примитивов нет ссылочного типа void
. То есть нет никакого способа примитивного типа ссылаться на какой-либо примитивный тип.
Итак, если вы хотите иметь алгоритм, который работает с произвольными переменными, вы можете использовать переменные типа java.lang.Object.
Если произвольные значения являются примитивами, используйте соответствующий объект Wrapper для их обертки и используйте ссылки java.lang.Object, чтобы манипулировать ими.
Вы также можете увидеть это в Collections
Классы обертки - это представители объектов примитивных типов данных, поэтому всякий раз, когда есть ситуация, чтобы использовать их в качестве объектов, мы должны их использовать. Использование обертки, когда нам нужны объекты и примитив, когда требуется эффективность.
1st - чтобы java полностью объектно ориентировался.
2nd - мы не можем передавать примитивный тип ссылкой на метод, и многие стандартные структуры данных, реализованные java, работают с объектом: например (ArrayList, HashSet, HashMap и т.д.), поэтому им нужен этот объект referenc