Является ли null Object
в Java?Является ли null объектом?
ответ
Если null был объектом, он поддерживал бы методы java.lang.Object
, такие как equals()
. Однако это не так - любой вызов метода по null приводит к NullPointerException
.
И это то, что Java Language Specification должен сказать по этой теме:
Существует также специальный типа нулевого, типа выражения нуля, которое не имеет имени. Поскольку нулевой тип не имеет имени , невозможно объявить переменную нулевого типа или присвоить нулевому типу. Нулевая ссылка является единственным возможным значением выражения нулевого типа. Нулевая ссылка всегда может быть отнесена к любому ссылочному типу . На практике программист может игнорировать нулевой тип и просто притворяться, что нуль - это просто специальный литерал , который может быть любого ссылочного типа .
Я думаю, что это можно сварить до «null is special».
Таким образом, объект в Java является только объектом, если он равен или подклассам java.lang.Object'. Практически - да. Вы не можете создать класс, который не является подклассом java.lang.Object, но я никогда не думал об этом с более философской точки зрения. –
Любопытно, что все [API doc для 'NullPointerException'] (http : //docs.oracle.com/javase/7/docs/api/java/lang/NullPointerException.html) упоминает объект «null» «... :) Но тогда было также хорошо говорить о» null указатели «... – Lumi
Вы сказали:« Нулевая ссылка всегда может быть применена к любому ссылочному типу ». Итак, можем ли мы вернуть null (typecasted-if allowed) в методе с типом ссылки на объект (возврат)? – Srichakradhar
Нет, это не объект.
Нет, это не экземпляр класса или класса. Это ссылка на ничего.
Редактировать: не прочитал спецификацию, поэтому вышеуказанные могут быть не точными на 100%.
Null - это недостаток объекта.
Но нулевой тип присваивается каждому ссылочному типу. –
Нет «нулевого типа»; null - это конкретное значение не-примитивных выражений (например, ссылок, в Java нет «ссылочного типа», насколько я понимаю). –
Tommy: JLS 4.1: «Существует также специальный тип null, тип выражения null, который не имеет имени». – Ken
Абсолютно нет: null instanceof Object
возвращает false.
И все же это назначение, совместимое со всеми ссылочными типами. –
В соответствии с Java spec, null
- это тип, который может быть назначен объектной переменной (в качестве значения, указанного в комментарии). Вы не можете создавать или создавать переменные этого типа, но вы должны использовать литерал null
, предоставленный компилятором.
null - это тип и значение. –
«null» - это, по-видимому, «экземпляр» типа «null». – strager
'null' не является переменной, это буквальный: [JLS, 3.10.7. Null Literal] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.7) –
Нет, это не объект, так как null instanceof Object всегда будет возвращать значение false, но есть только один null, а не один для каждого класса.
На самом деле, 'null instanceof
Как объяснена в главе 4.1 The Kinds of Types and Values в спецификации языка Java, нуля является типом, который имеет одно значения, нулевую ссылка (и представлен буквальный null
):
Существует также специальный null тип, тип выражения
null
, который имеет нет имени. Поскольку нулевой тип не имеет имени , невозможно объявить переменную нулевого типа или присвоить нулевому типу. Нулевая ссылка является единственным возможным значением выражения нулевого типа. Нулевая ссылка всегда может быть отнесена к любому ссылочному типу .На практике программист может игнорировать нулевой тип и просто притворяться, чтоnull
является просто специальным литералом , который может быть любого ссылочного типа .
Вы можете прочитать о Pattern Null Object (который я не рекомендую), хотя. Дополнительную информацию об этом шаблоне см. В разделе C2 Wiki или Wikipedia.
Согласно Java Spec,
Там также специальный нуль буквального , который может быть использован в качестве значения для любого ссылочного типа. null может быть присвоен любой переменной, кроме переменных примитивных типов. Вам мало что может сделать с нулевым значением за пределами тестирования на его присутствие. Поэтому null часто используется в программах как маркер , чтобы указать, что какой-либо объект недоступен.
№ Даже если бы это было так, это бесполезно, поскольку у него нет никаких методов или полей.
Java обрабатывает объекты через ссылки. Null - это разбиение OO-уровня Java, поскольку оно снижает уровень ниже уровня OO. Нет, это не объект, это ЗНАЧЕНИЕ ссылки. И это не имеет ничего общего с парадигмами объектов, но относится к сантехнике Java, которая позволяет создавать объекты.
Object foo = null;
System.out.println(foo.toString());
Первая строка показывает null
может быть присвоен тип Object
, но вторая линия будет продемонстрировать это, конечно, не Object
и в конечном итоге приводит к java.lang.NullPointerException
Является ли нулевой экземпляр java.lang.Object
? No.
Is null a объект? зависит от определения «is».
Я думаю, что на вашем платье есть пятно. Хотите, чтобы я проанализировал вашу ДНК для вас? –
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):
- The (в противном случае безымянный) нуль типа.
null
литерал.- 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). Потому что: нет яблоко большое яблоко? Нет, это не так.
Как Майкл подводит итог: «нуль особенный».
Apple и null? Вы не боитесь судебного процесса? :) –
No, null
не является объектом. Это ссылочный тип, и его значение не относится ни к одному объекту, и поэтому в памяти нет изображения null
.
ОП запросил (тип) 'Объект', а не _объект_ (как в _исследовании типа_). И [если кто-то перефразирует вопрос соответственно ...] (https://stackoverflow.com/a/12886252/1744774) –
- 1. Является объектом null?
- 2. Ошибка: Null не является объектом
- 3. WebDriver/'null' не является объектом
- 4. Является ли селектор объектом?
- 5. Почему typeof null является «объектом» в javascript?
- 6. (React Native) Null не является объектом
- 7. "'null' не является объектом (оценка 'apiData.original_release_date.split')";
- 8. Null не является объектом, создающим dropdown
- 9. Является ли приложение facebook объектом?
- 10. Является ли функция действительно объектом
- 11. Является ли Thread объектом ядра?
- 12. Является ли Python dict объектом?
- 13. Является ли `Range.Formula` COM-объектом?
- 14. Почему "undefined является null или не является объектом"?
- 15. Как проверить, является ли x объектом, но не строковым объектом
- 16. Является ли подобным массиву объектом тип данных
- 17. Состояние перенаправления: null не является объектом (оценка «имя»)
- 18. Является ли объект null в JavaScript?
- 19. Проверьте, является ли объектный литерал «объектом»
- 20. Проверьте, является ли переменная объектом PDO?
- 21. SQL - Является ли ассоциативная сущность слабым объектом?
- 22. Mongoose: проверьте, является ли объект объектом mongoose
- 23. Как проверить, является ли переменная объектом?
- 24. Является ли переменная «int nameofvariable» объектом?
- 25. Является ли объект объектом в Javascript?
- 26. Является ли массив возвращенным scandir() счетным объектом?
- 27. Является ли метод объектом в Java?
- 28. Является ли конструктор объектом объекта в JavaScript?
- 29. Является ли подпапка в ведре S3 объектом?
- 30. Проверьте, является ли тип объектом CLR
Нет, это не так, и для тех, кто задается вопросом, почему такой вопрос, существуют языки, где null действительно является объектом, подобным любому, например Ruby. – JRL
В Scala, который очень дотошен в отношении типов, существует тип 'Null' (a * trait *, фактически), имеющий единственный экземпляр' null'. –
@ JRL: Просто из любопытства, мне интересно, как это влияет на работу JRuby ... (Я недостаточно осведомлен об этом уровне реализации, чтобы точно знать.) –