Нет, это не так, и для тех, кто задается вопросом, почему такой вопрос, существуют языки, в которых null действительно является таким же объектом, как любой, например Ruby.
JRL,
7
В Scala, который очень тщательно относится к типам, есть тип Null(на самом деле черта ), имеющий единственный экземпляр null.
Carl Smotricz,
1
@JRL: Просто из любопытства, мне интересно, как это влияет на то, как работает JRuby ... (я недостаточно знаком с этим уровнем реализации, чтобы знать наверняка.)
Бенджамин Оукс
Чтобы добавить к комментарию @ JRL - приблизительный эквивалент Ruby для nullis nil, который является экземпляром NilClass
Элиот Сайкс
Или javascript, в котором null instanceof Objectfalse, но typeof(null)возвращается 'object'. В таком случае это объект? Кто знает.
Дон Хэтч
Ответы:
166
Если бы null был объектом, он поддерживал бы такие методы java.lang.Object, как equals(). Однако это не так - любой вызов метода с нулевым значением приводит к созданию файла NullPointerException.
Существует также специальный нулевой тип, тип выражения null, у которого нет имени. Поскольку нулевой тип не имеет имени, невозможно объявить переменную нулевого типа или привести к нулевому типу. Пустая ссылка - единственное возможное значение выражения нулевого типа. Пустую ссылку всегда можно привести к любому ссылочному типу. На практике программист может игнорировать нулевой тип
и просто притвориться, что null - это просто специальный литерал, который может быть любого ссылочного типа.
Таким образом, объект в Java является объектом, только если он равен или подклассам java.lang.Object. Практически - да. Вы не можете создать класс, который не является подклассом java.lang.Object, но я никогда не думал об этом с более философской точки зрения
Вы сказали: «Пустую ссылку всегда можно привести к любому ссылочному типу». Итак, можем ли мы вернуть null (типизированный - если разрешено) в методе с типом ссылки на объект (возвращаемого)?
Srichakradhar
1
@Srichakradhar: да, мы можем! Что легче узнать, попробовав это в коде, чем задавая здесь вопросы.
Майкл Боргвардт,
1
«Пустая ссылка - единственное возможное значение выражения нулевого типа». Пришло время прочитать документ со спецификациями. :)
sofs1
32
Согласно спецификации Java , nullэто тип, который может быть назначен объектной переменной (как значение, как указано в комментарии). Однако вы не можете создавать или создавать переменные этого типа, вы должны использовать литерал, nullпредоставленный компилятором.
3) объект в « объектной переменной », по сравнению с переменной класса, обычно ссылается не на тип, а на время жизни. При обращении к типу это обычно называется переменной ссылочного типа или, для краткости, ссылочной (типовой) переменной. Мне известны 4 типа в API Java, которые предоставляют переменные экземпляра / объекта (их может быть больше): массивы с егоlength и подклассами java.awt.geom.Point2D.
Герольд Брозер
28
Абсолютно нет: null instanceof Objectвозвращает false.
Но нулевой тип присваивается каждому ссылочному типу.
Том Хотин - tackline
Не существует «нулевого типа»; null - это конкретное значение непримитивных выражений (то есть ссылок; в Java, насколько я понимаю, тоже нет "ссылочного типа").
Томми МакГуайр,
3
Томми: JLS 4.1: «Существует также специальный нулевой тип, тип выражения null, у которого нет имени».
Как часто бывает, это зависит от того, с чего вы на это смотрите, кому вы больше верите.
Согласно JLS, да, это так . Особенно, если перефразировать вопрос: «Является ли nullбуквальным типом Object?». В дополнение к JLS 4.1, процитированному Майклом Боргвардтом выше:
Все прямые супертипы нулевого типа являются ссылочными типами, кроме самого нулевого типа.
[Подчеркнуто мной.]
Согласно компилятору Eclipse 2019-09, это не так :
true.toString();// Cannot invoke toString() on the primitive type booleannull.toString();// Cannot invoke toString() on the primitive type null
Согласно OpenJDK 12.0.1 javacэто :
true.toString();// error: boolean cannot be dereferencednull.toString();// error: <null> cannot be dereferenced
Если угловые скобки подразумевают, что nullэто не примитивный тип. И согласно JLS 4.1 :
В языке программирования Java есть два типа типов: примитивные типы (...) и ссылочные типы (...).
если не одно, то другое.
Клауди писал:
null - это некрасиво.
Наоборот, nullкрасиво. Что бы вы предложили в качестве значения по умолчанию для переменной ссылочного типа? Произвольная битовая комбинация? Добро пожаловать в нарушение прав доступа или, что еще хуже, в ад указателей!
Иоахим Зауэр писал:
null - это тип и значение.
Фактически, есть три элемента в сочетании с null (см. Также JLS 3.10.7 ):
Нулевой тип (иначе безымянный) .
nullБуквальным .
Ссылка нулевое значение. (Обычно сокращенно обозначается как значение null или просто null .)
(1) Обратите внимание, что согласно JLS 4.10.2, процитированному выше, нулевой тип использует множественное наследование не только для интерфейсов, но и для классов. Все мы знаем, что это невозможно для нас, программистов.
(2) Нулевой литерал можно представить как переменную, определяемую как:
JVM_global final null_type null = new null_type();
Иногда в качестве ключевых слов ошибочно принимают различные последовательности символов:
nullне ключевое слово, а скорее нулевой литерал ( §3.10.7 ).
Что касается null instanceof <any type>
Принимая во внимание JLS 4.10.2 (« нулевой тип - это подтип каждого типа»), null instanceof <any type>должно предполагаться, что он должен оцениваться true, не так ли? На первый взгляд, да, но JLS 15.20.2 дает ясный ответ:
[...] результат от instanceofоператора является , trueесли значение в ВыраженияОтношении неnull [...]. В противном случае результат естьfalse .
[Подчеркнуто мной.]
Спросите себя, что имеет больше смысла (с точки зрения прикладного программиста):
Предоставление falseи, таким образом, указание на то, что ссылочное выражение не относится к типу, доступному нам, т.е. указание, что оно не ссылается на что-либо полезное для нас.
или давая true, таким образом сообщая нам, что выражение оценивает специальную ссылку, нулевую ссылку , ссылающуюся на «объект», который мы не знаем, существует ли он вообще, и который имеет специальный нулевой тип, который не имеет имени, не подвергается us, но через нулевой литерал , является ли подтип любого типа, включая множественное наследование, и его все равно следует игнорировать? Рассмотрим также более практичный пример:
classCarimplementsVehicle{...Vehicle car =null;...boolean b = car instanceofCar;// True? There's not even an instance...// which could be of type Car.
Что также приводит к:
Почему instanceofнельзя сказать что-то об nullОбъективности?
Это называется instanceofнет sameorsubtypeof. Это означает, что мы сравниваем тип экземпляра с типом, а не с двумя типами. Теперь nullозначает: «Нет экземпляра», а если экземпляра нет, нет и его типа. Очевидно, что сравнение ничего с чем-то должно вести false.
Или в "более" реальном примере:
У меня в руках полноразмерное изображение яблока ( = эталонного типа ) с надписью «Большое яблоко» ( = название эталонного типа ).
Передо мной стол ( = куча ).
Если на столе есть яблоко ( = экземпляр ), к нему подключен шнур ( = ссылка ).
Другой конец этого шнура я держу в руке ( = контрольная переменная ).
Я прорисовываю яблоко вдоль шнура и сравниваю его с моей картинкой ( = instanceof ).
Если яблоко такого же размера или больше, чем изображение, к нему применяется надпись «Большое Яблоко» ( = true ).
Если меньше, то нет ( = ложь ).
Если на столе нет яблока (= нет экземпляра ) и, следовательно, нет шнура ( = null ), запись также не применяется ( = false ). Потому что: Разве не яблоко - большое яблоко? Нет, это не так.
Как резюмирует Майкл: «null действительно особенный».
Как объяснялось в главе 4.1 Типы типов и значений спецификации языка Java, null - это тип, который имеет одно значение, нулевую ссылку (и представлен литералом null):
Существует также специальный нулевой тип, тип выражения null, у которого нет имени. Поскольку нулевой тип не имеет имени, невозможно объявить переменную нулевого типа или привести к нулевому типу. Пустая ссылка - единственное возможное значение выражения нулевого типа. Пустую ссылку всегда можно привести к любому ссылочному типу. На практике программист может игнорировать нулевой тип и просто притвориться, что nullэто просто специальный литерал, который может быть любого ссылочного типа.
Вы можете прочитать о шаблоне пустого объекта (который я не рекомендую). См. C2 Wiki или Wikipedia для получения дополнительной информации об этом шаблоне.
Нет, не является объектом, поскольку null instanceof Object всегда будет возвращать false, также есть только один null, а не по одному для каждого класса.
Также существует специальный нулевой литерал, который можно использовать как значение для любого ссылочного типа. null может быть присвоен любой переменной, кроме переменных примитивных типов. Вы мало что можете сделать с нулевым значением, кроме проверки его наличия. Поэтому значение null часто используется в программах в качестве маркера, чтобы указать, что какой-то объект недоступен.
Java обрабатывает объекты через ссылки. Null - это нарушение объектно-ориентированности Java, поскольку оно опускает вас ниже объектно-ориентированного уровня. Нет, это не объект, это ЗНАЧЕНИЕ ссылки. И это не имеет ничего общего с объектными парадигмами, но относится к технологии Java, которая позволяет использовать объекты.
Первая строка показывает, что nullее можно присвоить типу Object, но вторая строка продемонстрирует, что это, конечно, не так, Objectи в конечном итоге приведет кjava.lang.NullPointerException
Null
(на самом деле черта ), имеющий единственный экземплярnull
.null
isnil
, который является экземпляром NilClassnull instanceof Object
false, ноtypeof(null)
возвращается'object'
. В таком случае это объект? Кто знает.Ответы:
Если бы null был объектом, он поддерживал бы такие методы
java.lang.Object
, какequals()
. Однако это не так - любой вызов метода с нулевым значением приводит к созданию файлаNullPointerException
.И вот что говорится в спецификации языка Java по этой теме:
Я думаю, это можно свести к «нулю особенный».
источник
java.lang.Object
. Практически - да. Вы не можете создать класс, который не является подклассом java.lang.Object, но я никогда не думал об этом с более философской точки зренияNullPointerException
упоминается »null
объект«… :) Но тогда можно было говорить и о «нулевых указателях»…Согласно спецификации Java ,
null
это тип, который может быть назначен объектной переменной (как значение, как указано в комментарии). Однако вы не можете создавать или создавать переменные этого типа, вы должны использовать литерал,null
предоставленный компилятором.источник
null
Название является «экземпляром» изnull
типа, по- видимому.null
не переменная, это литерал: JLS, 3.10.7. The Null Literalnull
это тип, который может быть назначен »: 1)null
(в коде) - это нулевой литерал , а не нулевой тип 2) Типы не могут быть присвоены переменным в Java в целом, см. JLS 4.1: « Есть [... ] два типа значений данных, которые могут храниться в переменных [...]: примитивные значения (§4.2) и ссылочные значения (§4.3). « Это пустая ссылка, которая может быть назначена черезnull
литерал. ... продолжение ...length
и подклассамиjava.awt.geom.Point2D
.Абсолютно нет:
null instanceof Object
возвращает false.источник
Нет, это не объект.
источник
Нуль - это отсутствие объекта.
источник
JRL написал:
Как часто бывает, это зависит от того, с чего вы на это смотрите, кому вы больше верите.
Согласно JLS, да, это так . Особенно, если перефразировать вопрос: «Является ли
null
буквальным типомObject
?». В дополнение к JLS 4.1, процитированному Майклом Боргвардтом выше:См. JLS 3.10.7 :
и JLS 4.10 :
или JLS 4.10.2 :
[Подчеркнуто мной.]
Согласно компилятору Eclipse 2019-09, это не так :
Согласно OpenJDK 12.0.1
javac
это :Если угловые скобки подразумевают, что
null
это не примитивный тип. И согласно JLS 4.1 :если не одно, то другое.
Клауди писал:
Наоборот,
null
красиво. Что бы вы предложили в качестве значения по умолчанию для переменной ссылочного типа? Произвольная битовая комбинация? Добро пожаловать в нарушение прав доступа или, что еще хуже, в ад указателей!Иоахим Зауэр писал:
Фактически, есть три элемента в сочетании с null (см. Также JLS 3.10.7 ):
null
Буквальным .(1) Обратите внимание, что согласно JLS 4.10.2, процитированному выше, нулевой тип использует множественное наследование не только для интерфейсов, но и для классов. Все мы знаем, что это невозможно для нас, программистов.
(2) Нулевой литерал можно представить как переменную, определяемую как:
JVM_global final null_type null = new null_type();
Также обратите внимание на JLS 3.9 :
Что касается
null instanceof <any type>
Принимая во внимание JLS 4.10.2 (« нулевой тип - это подтип каждого типа»),
null instanceof <any type>
должно предполагаться, что он должен оцениватьсяtrue
, не так ли? На первый взгляд, да, но JLS 15.20.2 дает ясный ответ:[Подчеркнуто мной.]
Спросите себя, что имеет больше смысла (с точки зрения прикладного программиста):
Предоставление
false
и, таким образом, указание на то, что ссылочное выражение не относится к типу, доступному нам, т.е. указание, что оно не ссылается на что-либо полезное для нас.или давая
true
, таким образом сообщая нам, что выражение оценивает специальную ссылку, нулевую ссылку , ссылающуюся на «объект», который мы не знаем, существует ли он вообще, и который имеет специальный нулевой тип, который не имеет имени, не подвергается us, но через нулевой литерал , является ли подтип любого типа, включая множественное наследование, и его все равно следует игнорировать? Рассмотрим также более практичный пример:Что также приводит к:
Почему
instanceof
нельзя сказать что-то обnull
Объективности?Это называется
instanceof
нетsameorsubtypeof
. Это означает, что мы сравниваем тип экземпляра с типом, а не с двумя типами. Теперьnull
означает: «Нет экземпляра», а если экземпляра нет, нет и его типа. Очевидно, что сравнение ничего с чем-то должно вестиfalse
.Или в "более" реальном примере:
Как резюмирует Майкл: «null действительно особенный».
источник
Нет, это не экземпляр класса или класса. Это ссылка ни на что.
Изменить : не читал спецификацию, поэтому приведенное выше может быть неточным на 100%.
источник
Как объяснялось в главе 4.1 Типы типов и значений спецификации языка Java, null - это тип, который имеет одно значение, нулевую ссылку (и представлен литералом
null
):Вы можете прочитать о шаблоне пустого объекта (который я не рекомендую). См. C2 Wiki или Wikipedia для получения дополнительной информации об этом шаблоне.
источник
Нет. Даже если бы это было так, это бесполезно, так как у него нет никаких методов или полей.
источник
Нет, не является объектом, поскольку null instanceof Object всегда будет возвращать false, также есть только один null, а не по одному для каждого класса.
источник
null instanceof <anytype>
тоже вернетсяfalse
.Согласно спецификации Java ,
источник
Java обрабатывает объекты через ссылки. Null - это нарушение объектно-ориентированности Java, поскольку оно опускает вас ниже объектно-ориентированного уровня. Нет, это не объект, это ЗНАЧЕНИЕ ссылки. И это не имеет ничего общего с объектными парадигмами, но относится к технологии Java, которая позволяет использовать объекты.
источник
Является ли null экземпляром
java.lang.Object
? Нет .Является ли null объектом ? зависит от определения « есть ».
источник
Первая строка показывает, что
null
ее можно присвоить типуObject
, но вторая строка продемонстрирует, что это, конечно, не так,Object
и в конечном итоге приведет кjava.lang.NullPointerException
источник
Нет,
null
это не объект. Это ссылочный тип, и его значение не относится ни к какому объекту, поэтомуnull
в памяти нет представления .источник
Object
, а не объект (как в случае типа ). И если перефразировать вопрос соответствующим образом ...