Подтвердить что ты не робот

Почему Java не разрешает null при объявлении примитивных типов данных

Это продолжение моего предыдущего вопроса и принятие ответов на этот вопрос Объявление классов обертки

Java переносит примитивный тип данных на классы-оболочки, а затем почему

char c = null; // invalid
int i = null; // invalid

не разрешено, но

Character cObj = null; // valid
Integer iObj = null; // valid

разрешено.

4b9b3361

Ответ 1

Поскольку примитивы представляют значение, а переменные Object представляют ссылки (что-то вроде указателей) на сложные объекты данных. Нет нулевого значения general, это специальное ключевое слово, которое "ссылается на ничего" или пустую ссылку - это очень непрофессиональный ответ, но я думаю, что это будет наиболее подходящим.

Кроме того, что может быть, на ваш взгляд, численным значением null? 0? -1? Но, это допустимые целые числа, а что еще?

Я настоятельно рекомендую вам ознакомиться с следующим сложным java-учебником. Каждый аспект, о котором вы просили, объясняется там и поддерживается с примерами.

Ответ 2

null означает "отсутствие объекта". В ссылках может отсутствовать объект, примитивы не могут.

Ответ 3

Переменные типа примитива Java хранятся по значению вместо переменных-по-ссылке. Где в качестве классов-оболочек есть объекты, в основном как любой другой объект Java, за исключением того, что все, что они делают, это обернуть примитивный тип.

Ответ 4

Контрольные значения (часто только ссылки) являются указателями на эти объекты и специальную нулевую ссылку, которая не относится к объекту.

В соответствии с jls-4.3.1 бессмысленно брать ссылку null без существования объекта.

Ответ 5

Наряду со всем вышеприведенным ответом я тоже хотел бы добавить этот пункт.

Для примитивных типов мы имеем фиксированный размер памяти i.e для int у нас есть 4 байта, а char - 2 байта. И null используется только для объектов, потому что размер памяти не фиксирован.

Итак, по умолчанию мы имеем

   int a=0;

а не

   int a=null;

То же самое с другими примитивными типами, и поэтому null используется только для объектов, а не для примитивных типов.

Ответ 6

Объекты, такие как Character и Integer, являются указателями: фактическое число, хранящееся в байтах, которые являются этим значением переменной, представляет собой адрес в памяти для остальной части памяти JVM. Таким образом, возможно и значимо установить это число на адрес, который никуда не идет, что является нулевым.

Однако примитив, такой как int или char, имеет число, которое интерпретируется как число (целое число или код ASCII), и нет способа сделать его "не числом", потому что все, что может иметь память магазин - это номера.

Ответ 7

Ссылаясь на unboxing/autoboxing, вы должны представить, что они похожи на два способа, которые компилятор принимает, чтобы избавить вас от сумасшествия с непрерывным "отбрасыванием" от примитива к объекту и наоборот, но они не безупречны.

Что произойдет, если ваша Integer-оболочка имеет значение null и вы выполняете разделение? Не деление на 0, а исключение Null указателя, потому что java не может удалить незарегистрированный объект!

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