2009-12-12 4 views
108

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

+40

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

+6

В Scala, который очень дотошен в отношении типов, существует тип 'Null' (a * trait *, фактически), имеющий единственный экземпляр' null'. –

+1

@ JRL: Просто из любопытства, мне интересно, как это влияет на работу JRuby ... (Я недостаточно осведомлен об этом уровне реализации, чтобы точно знать.) –

ответ

155

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

И это то, что Java Language Specification должен сказать по этой теме:

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

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

+0

Таким образом, объект в Java является только объектом, если он равен или подклассам java.lang.Object'. Практически - да. Вы не можете создать класс, который не является подклассом java.lang.Object, но я никогда не думал об этом с более философской точки зрения. –

+0

Любопытно, что все [API doc для 'NullPointerException'] (http : //docs.oracle.com/javase/7/docs/api/java/lang/NullPointerException.html) упоминает объект «null» «... :) Но тогда было также хорошо говорить о» null указатели «... – Lumi

+0

Вы сказали:« Нулевая ссылка всегда может быть применена к любому ссылочному типу ». Итак, можем ли мы вернуть null (typecasted-if allowed) в методе с типом ссылки на объект (возврат)? – Srichakradhar

9

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

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

11

Null - это недостаток объекта.

+0

Но нулевой тип присваивается каждому ссылочному типу. –

+0

Нет «нулевого типа»; null - это конкретное значение не-примитивных выражений (например, ссылок, в Java нет «ссылочного типа», насколько я понимаю). –

+2

Tommy: JLS 4.1: «Существует также специальный тип null, тип выражения null, который не имеет имени». – Ken

26

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

+14

И все же это назначение, совместимое со всеми ссылочными типами. –

30

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

+8

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

+5

«null» - это, по-видимому, «экземпляр» типа «null». – strager

+0

'null' не является переменной, это буквальный: [JLS, 3.10.7. Null Literal] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.7) –

4

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

+3

На самом деле, 'null instanceof ' также вернет 'false'. – Bombe

4

Как объяснена в главе 4.1 The Kinds of Types and Values в спецификации языка Java, нуля является типом, который имеет одно значения, нулевую ссылка (и представлен буквальный null):

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

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

4

Согласно Java Spec,

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

4

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

4

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

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

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

3

Является ли нулевой экземпляр java.lang.Object? No.

Is null a объект? зависит от определения «is».

+0

Я думаю, что на вашем платье есть пятно. Хотите, чтобы я проанализировал вашу ДНК для вас? –

9

JRL писал:

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

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

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

См JLS 3.10.7:

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

и JLS 4.10:

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

или JLS 4.10.2:

Непосредственные супертипами нулевого типа все ссылочные типы, кроме самого типа нуль.

[. Акцентами мной]

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

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 

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

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

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


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

нуль вроде некрасиво.

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


Joachim Sauer писал:

нуль является типом и значением.

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

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

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

(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 истинно, если значение из ВыраженияОтношения не пустой [.. .]. В противном случае результат будет ложным.

[акцентами мной.]

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

  • Предоставление 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 «s?

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

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

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


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

+2

Apple и null? Вы не боитесь судебного процесса? :) –

1

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

+0

ОП запросил (тип) 'Объект', а не _объект_ (как в _исследовании типа_). И [если кто-то перефразирует вопрос соответственно ...] (https://stackoverflow.com/a/12886252/1744774) –

Смежные вопросы