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

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

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

4b9b3361

Ответ 1

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

И вот что говорит Language Language Specification:

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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: <null> cannot be dereferenced

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

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

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


Claudiu писал (а):

null является некрасивым.

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


Joachim Sauer писал (а):

null - это тип и значение.

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

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

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

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

JVM_global final null_type null = new null_type();

Примечание также JLS 3.9:

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


Относительно null instanceof <anytype>:

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

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

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

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

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

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

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

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

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

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

Или в примере "более" реального мира:

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


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

Ответ 8

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

Ответ 9

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

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

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

Ответ 10

В соответствии с Java Spec,

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

Ответ 11

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

Ответ 12

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

Ответ 13

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

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

Ответ 14

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

В первой строке показано, что null можно присвоить типу Object, но вторая строка продемонстрирует, что это, конечно, не Object.

Ответ 15

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