Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Основные отличия примитивных типов от непримитивных в Java

#java


Integer or int.

Character or char.

Я понимаю и пользуюсь ими когда нужно, но почему так - не знаю.
    


Ответы

Ответ 1



Возьмусь предположить, что вы спрашиваете разницу между примитивными типами и классами обертками. Примитивные типы Выигрыш в производительности. Оболочки (обертки) типов Являются частью объектной иерархии. Необходимы в случаях когда класс может работать только с объектами. Удобство использования таких полей как MAX_VALUE и.т.д. P.S. Прекрасный ответ о причинах введения автоматической автоупаковки/распаковки.

Ответ 2



Непримитивные являются классами, потомками Object. Соответственно, передаются по ссылке. К ним применяются все правила работы с классами и объектами. Это часто бывает нужно, если их нужно передать в качестве аргумента методу, принимающему Object. Или указать в качестве параметра типа для Generic-а. Например, List. Но не может быть List. В свою очередь, примитивные типы передаются по значению. Занимают меньше памяти и лишены при обработке оверхеда объектов. Во многих случаях при присвоении или передаче значения Java конвертирует примитивные типы в их объектные обёртки и обратно автоматически. Подробнее можно узнать в спецификации языка: http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.1 EDIT: Важно не путать, что именно мы передаём по значению, а что - по ссылке. Любая переменная ссылочного типа (reference type) хранит в себе ссылку на объект или null, если она не связана с объектом. Так же, как и в случае с переменной примитивного типа, переменная ссылочного типа передаётся по значению. В этом смысле разницы между ними нет. Однако большая разница возникает, когда думаем о передаче примитива и объекта (или массива). Передавая примитивное значение, в вызванном методе мы теряем всякую связь с прежней переменной, содержавшей это значение, и никак на неё повлиять не можем. Однако, передавая ссылку, мы получаем ключ к объекту или массиву, что в общем случае создаёт проблему shared mutable state и может привести к разного рода "сюрпризам", когда объект-владелец переменной внезапно обнаруживает (или даже и не обнаруживает), что значение его атрибута изменилось. С помощью специальных методик проектирования классов (или специальных библиотек с такими классами) можно добиться того, чтобы однажны созданные экземпляры ссылочных типов было (почти) невозможно изменить. Ключевые слова: immutable type, persistent type, value object. В языках JVM, ориентированных на функциональное программирование, такие типы входят в базовую библиотеку. В самой Java таким образом реализованы, например, обёртки над примитивными типами и String.

Ответ 3



В Java есть 2 группы типов: ссылочные и примитивные. Примитивных всего 8: Целые числа - byte, short, char, int, long. Числа с плавающей точкой (иначе дробные) - float, double. Логический - boolean. Остальные типы являются наследниками класса Object и являются ссылочными. Ссылочные передаются в методы(функции) по ссылке, т.е. если вы измените в функции ссылочный тип - то они изменится и в точке вызова (в месте, откуда вы его передали). Примитивные же передаются по значению: т.е. что бы вы не сделали с передаваемым примитивным типом в функции/методе, это всё навсегда останется внутри функции/метода, и снаружи (в точке вызова) он (и его значение) останется таким же после отрабатывания функции. Подробнее читайте тут.

Комментариев нет:

Отправить комментарий