Является ли null объектом?

Является ли null Object в Java?

Если null был объектом, он поддерживал бы методы java.lang.Object такие как equals() . Однако это не так – любой вызов метода по null приводит к NullPointerException .

И это то, что спецификация Java Language Specification должна сказать по этому вопросу:

Существует также специальный тип null, тип выражения null, который не имеет имени. Поскольку нулевой тип не имеет имени, невозможно объявить переменную нулевого типа или применить к нулевому типу. Нулевая ссылка – единственное возможное значение выражения нулевого типа. Нулевая ссылка всегда может быть перенесена на любой ссылочный тип. На практике программист может игнорировать нулевой тип и просто притворяться, что null – это просто специальный литерал, который может быть любого ссылочного типа.

Я думаю, что это можно свести к «null is special».

Согласно спецификации Java, null – это тип, который может быть назначен объектной переменной (как значение, указанное в комментарии). Вы не можете создавать или создавать переменные этого типа, но вы должны использовать литерал null предоставленный компилятором.

Абсолютно нет: null instanceof Object возвращает false.

Нет, это не объект.

Нуль – это отсутствие объекта.

JRL писал (а):

Нет, это не так, …

Как часто, это зависит от того, где вы смотрите на него, кого вы верите больше.

По данным JLS, да, это так . Особенно, если вы перефразируете вопрос: «Является ли null литерал типа Object ?». В дополнение к JLS 4.1, приведенному Майклом Боргвардтом выше:

См. JLS 3.10.7 :

Нулевой литерал всегда имеет нулевой тип.

и JLS 4.10 :

Подтипы типа T являются всеми типами U такими, что T является супертипом U и нулевым типом.

или JLS 4.10.2 :

Прямые супертипы нулевого типа являются ссылочными типами, отличными от самого нулевого типа.

[Подчеркивает меня.]

Согласно компилятору Eclipse Juno это не так :

 true.toString(); // Cannot invoke toString() on the primitive type boolean null.toString(); // Cannot invoke toString() on the primitive type null 

Согласно JDKs 1.7.0_07 javac это :

 true.toString(); // error: boolean cannot be dereferenced null.toString(); // error:  cannot be dereferenced 

Если угловые скобки означают для меня, что null имеет иной, чем примитивный тип. И согласно JLS 4.1 :

В языке программирования Java существуют два типа типов: примитивные типы и ссылочные типы.

Итак, если это не тот, то другой.


Клаудиу писал:

null – это некрасиво.

Au contraire, null красиво. Что бы вы предложили в качестве значения по умолчанию для переменной ссылочного типа? Произвольная битовая комбинация? Добро пожаловать на нарушение прав доступа или, что еще хуже, на указатель ад!


Иоахим Зауэр писал:

null – тип и значение.

На самом деле существует три элемента в сочетании с нулевым (см. Также JLS 3.10.7 ):

  1. Нулевой тип (иначе называемый).
  2. null литерал .
  3. Нулевое опорное значение. (Обычно сокращенно нулевое значение или просто null .)

(1) Обратите внимание, что в соответствии с приведенным выше JLS 4.10.2 тип null использует множественное наследование не только для интерфейсов, но и для classов. Мы все знаем, что для программистов приложений это невозможно.

(2) Нулевой литерал можно представить как переменную, определяемую как:

JVM_global final null_type null = new null_type();

Также обратите внимание на JLS 3.9 :

[…], в то время как null может показаться ключевым словом, это технически нулевой литерал.


Что касается null instanceof :

С учетом JLS 4.10.2 (« нулевой тип является подтипом каждого типа») null instanceof должен оцениваться как true , не так ли? На первый взгляд, да, но JLS 15.20.2 дает ответ на проницательность:

[…] результатом оператора instanceof является true, если значение RelationalExpression не равно null […]. В противном случае результат будет ложным .

[Подчеркивает меня.]

Спросите себя, что имеет смысл (с точки зрения программиста):

  • Предоставление false и, таким образом, указание на то, что ссылочное выражение не относится к нам, т.е. указывает на то, что оно не ссылается на что-либо полезное для нас

  • или давая true , тем самым информируя нас о том, что выражение оценивается по специальной ссылке, нулевая ссылка , ссылающаяся на «объект», который мы не знаем, существует ли она и которая имеет особый нулевой тип, который не имеет имени, не подвергается для нас, но через нулевой литерал , является подтипом любого типа, включая множественное наследование, и в любом случае его следует игнорировать? Рассмотрим также более практичный пример:

      RedBullStratosBalloon balloon = null; boolean b = balloon instanceof Aircraft; // True? There's not even an instance // which could be of type Aircraft. 

Что также приводит к:

Почему instanceof не является правильным способом сказать что-то о объекте null ?

Это называется instanceof not sameorsubtypeof . Это означает, что мы сравниваем тип экземпляра с типом, а не с двумя типами. Теперь null означает: «Нет экземпляра», и если нет экземпляра, тип экземпляра отсутствует. Очевидно, что сравнение ничего с чем-то должно привести к false .

Или в «более» реальном примере:

  • У меня есть реальная картина яблока ( = ссылочный тип ) в моих armх с надписью «Big Apple» ( = имя ссылочного типа ).
  • Перед нами стол ( = куча ).
  • Если на столе есть яблоко ( = экземпляр ), к нему подключается шнур ( = ссылка ).
  • Я держу другой конец этого шнура в руке ( = контрольная переменная ).
  • Я прослеживаю яблоко вдоль шнура и сравниваю его с моим изображением ( = instanceof ).
  • Если яблоко того же размера или больше, чем на картинке, к ней применяется «Большое яблоко» ( = true ).
  • Если он меньше, то не ( = false ).
  • Если на столе нет яблока, и, следовательно, никакой шнур не существует ( = null ), запись не применяется ни ( = false ). Потому что: Разве яблоко не яблоко? Нет, это не так.

Как Майкл подводит итог: «Нуль является особенным».

Нет, это не экземпляр classа или classа. Это ссылка на ничего.

Редактировать : не читайте спецификацию, чтобы вышеуказанное не было на 100% точным.

Нет, это не объект, так как null instanceof Object всегда будет возвращать false, также существует только один null, а не один для каждого classа.

Как объясняется в главе 4.1 «Виды типов и значений спецификации языка Java», null – это тип, который имеет одно значение, нулевую ссылку (и представлен литеральным null ):

Существует также специальный тип null , тип выражения null , который не имеет имени. Поскольку нулевой тип не имеет имени, невозможно объявить переменную нулевого типа или применить к нулевому типу. Нулевая ссылка – единственное возможное значение выражения нулевого типа. Нулевая ссылка всегда может быть перенесена на любой ссылочный тип. На практике программист может игнорировать нулевой тип и просто притворяться, что null – это просто специальный литерал, который может быть любого ссылочного типа.

Возможно, вы захотите прочитать о шаблоне нулевого объекта (который я не рекомендую). Более подробно об этом шаблоне см. В вики Wiki или Wikipedia .

Согласно Java Spec ,

Существует также специальный нулевой литерал, который может использоваться как значение для любого ссылочного типа. null может быть присвоен любой переменной, кроме переменных примитивных типов. Мало что вы можете сделать с нулевым значением за пределами тестирования для его присутствия. Поэтому null часто используется в программах как маркер, чтобы указать, что какой-то объект недоступен.

Нет. Даже если бы это было так, это бесполезно, поскольку у него нет никаких методов или полей.

Java обрабатывает объекты через ссылки. Null – это разбиение OO-уровня Java, поскольку оно снижает уровень ниже уровня OO. Нет, это не объект, это ЗНАЧЕНИЕ ссылки. И это не имеет ничего общего с парадигмами объектов, но относится к сантехнике Java, которая позволяет создавать объекты.

Является ли null экземпляром java.lang.Object ? Нет.

Является ли null объектом ? зависит от определения « есть ».

 Object foo = null; System.out.println(foo.toString()); 

Первая строка показывает, что null может быть присвоен типу Object , но вторая строка будет демонстрировать, что это, конечно, не Object и в итоге приводит к java.lang.NullPointerException

Нет, null не является объектом. Это ссылочный тип, и его значение не относится к какому-либо объекту, и поэтому нет представления null в памяти.

  • Почему NULL-указатели различаются по-разному на C и C ++?
  • В Objective-C почему я должен проверить, не является ли self = нулевым?
  • C #: Передача null в перегруженный метод - какой метод вызывается?
  • Можно ли удалить nullptr в c ++ 0x?
  • Null check chain vs catching NullPointerException
  • ListView getChildAt возвращает null для видимых детей
  • Спящий режим с нулями
  • Если Int не может быть нулевым, что означает значение null.asInstanceOf ?
  • Возможна ли пустая ссылка?
  • В C или C ++ следует проверить параметры указателя на NULL / nullptr?
  • Какую @NotNull Java-аннотацию следует использовать?
  • Давайте будем гением компьютера.