Чи є 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 як літеральний параметр конструктору анонімного внутрішнього класу (наприклад,
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() { } }
Порівняйте три реалізації вузлів бінарного дерева з методами послідовного виведення в консоль:
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ