Является ли null объектом? Я могу совершенно точно сказать, что не является. В том смысле, что
(null instanceof Object)
выдаст значение false
. Вот что ещё нужно знать о null:
- Вы не можете вызвать метод со значением null:
x.m()
выдаст ошибку, когдаx
является null, аm
— нестатический метод. Кстати, еслиm
— статический метод, товсё хорошо, поскольку важен только классx
, а значение игнорируется. - Есть только один null на всех, а не отдельный для каждого класса. Таким образом,
((String) null == (Hashtable) null)
, например. - Вполне допустимо передавать null в качестве параметра методу, если метод это допускает (некоторые методы допускают null-параметр, другие — нет). Так, например, вы вполне можете написать
System.out.println (null)
, а вотbutstring.compareTo (null)
не получится. Так что всегда указывайте в javadoc-комментариях ваших методов, допустим ли null в качестве их параметров, если это не вполне очевидно. - В JDK начиная с версии 1.1 и вплоть до 1.1.5 передача null в качестве литерального параметра(literal argument) конструктору анонимного внутреннего класса (например,
new SomeClass(null) { ...}
вызывало ошибку компиллятора. Зато можно передать выражение со значением null, или передать принудительный null, в видеnew SomeClass((String) null) { ...}
- Существует по меньшей мере три разных случая, которые обычно выражены с помощью null:
- Uninitialized (отсутствие инициализации). Переменная или слот, которой ещё не присвоили никакго значения.
- Non-existant/not applicable («не существует/не применимо»).Например, терминальные узлы бинарного дерева можно назвать обычными узлами с null-потомками.
- Empty (пустота чего-либо). Например, вы можете использовать null чтобы представить пустое дерево. Обратите внимание, что это существенно отличается от предыдущего случая (на практике их часто путают). Разница заключается в том, является ли null приемлемым узлом дерева или null означает, что значение не нужно обрабатывать как узел дерева.
// null означает «не применимо» // Здесь нет пустого дерева. class Node { Object data; Node left, right; void print() { if (left != null) left.print(); System.out.println(data); if (right != null) right.print(); } }
// null означает пустое дерево // обратите внимание на статические и нестатические методы class Node { Object data; Node left, right; void static print(Node node) { if (node != null) node.print(); } void print() { print(left); System.out.println(data); print(right); } }
// Отдельный класс для Empty // null не используется interface Node { void print(); } class DataNode implements Node{ Object data; Node left, right; void print() { left.print(); System.out.println(data); right.print(); } } class EmptyNode implements Node { void print() { } }
Сравните три реализации узлов бинарного дерева с методами последовательного вывода в консоль:
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ